構造体 Visual Basic VB.NET入門

      2017/09/28


構造体とは
複数の値をまとめて格納できる型です。
関連するモノをいちいち変数を宣言してもわかりにくいですよね。
基本的にはクラスでできることは構造体でも多分できます。

備考:object型は全てのクラスの上にありますのでテキストコントロールとかもobjectも持ってます。

構造体の定義
構文
Public Structure 構造体名
メソッド・プロパティの定義
End Structure

構造体の宣言
構造体名
dim 変数名 As New 構造体名

Newで初期化しないと怒られます。

宣言と定義の違い
定義はクラスや構造体などを定義するときです。
宣言は今からクラスや構造体を使う宣言することです。

プロパティ
構文
Public Property プロパティ名 As データ型
Get
return 返す変数
End Get
Set(ByVal value As データ型)
データを保存処理
End Set
End Property

何だが長いしわかりにくいと思われたかもしれませんが簡単です。
クラスのプロパティと一緒です。

なぜプロパティがあるかですが想定外の値を入れないためです。
ただ値を保存したいなら変数でいいですよね。

ずばりGetは返す変数を書けばいいだけです。
返す変数とはプロパティの前に普通に宣言されている変数です。
プロパティが値を持っているわけではなく変数を仲介しているわけです。

Setはデータを保存する処理ですね。
意味ないですが何もしないなら返す変数に入れたいデータを代入します。
想定外の値をいれたくないならif文を書いてチェックしてから代入しますね。

日本語で書くとややこしいのでサンプルを書きます。

サンプルソース

Public Class Form1

Public Structure person
Private newPropertyValue As Integer

Public Property NewProperty() As Integer
Get
Return newPropertyValue
End Get
Set(ByVal value As Integer)
If value <= 9 Then

newPropertyValue = value

Else

newPropertyValue = 0

End If

End Set
End Property

End Structure

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim per As New person

per.NewProperty = 10
MsgBox(per.NewProperty)
End Sub

End Class


実行結果は0が表示されます。
if文のところでチェックしてますね。
10じゃあなく3に変えれば実行結果は3になります。

デバッグでステップ実行で確認したいところですが飛びません。
すいません。
デバッグの設定が間違っていました。
ツール→オプション→デバッグ全般→プロパティおよび演算子をステップオーバーする(マネージのみ)
これでプロパティもステップインできました。
この設定をしていない時は出力パネルにステップイン時エラーメッセージが表示されてました。
2013なのでバージョンが違うとこの通りではないかもしれません。
一応ステップインできないかたは出力パネルに表示させましょう。

Debug.Print(文字列)

これでそのルートを通っていれば出力パネルに表示されます。

サブルーチンとファンクションは一緒です。
呼ぶ出すときはインスタンス名.サブルーチン
呼ぶ出すときはインスタンス名.ファンクション

引数のあるコンストラクタ
Sub New(引数)

End Sub
引数のないコンストラクタ
Shaed Sub New(引数)

End Sub
この場合の引数とは
Dim per As New person
ありだと
Dim per As New person(引数)

コンストラクタはインスタンスが生成された時に作成されます。
newしたときだと思っていたのですが怪しいです。

サンプルソース
Public Class Form1Public Structure person
Shared Sub New()Debug.Print(3)
End Sub
Private newPropertyValue As Integer

Public Property NewProperty() As Integer
Get
Return newPropertyValue
End Get
Set(ByVal value As Integer)
If value <= 9 Then
newPropertyValue = value

Else
newPropertyValue = 0

End If

End Set
End Property

End Structure

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Debug.Print(1)
Dim per As New person
Debug.Print(2)

per.NewProperty = 9
Debug.Print(4)
MsgBox(per.NewProperty)
End Sub

End Class

Debug.Printを書いてタイミングを実験してみました。
実行結果は1234と出力パネルに表示さえます。
結果だけみるとインスタンスを使用してアクセスしたときなのかな?
コンストラクタには初期化処理を書いたりします。

列挙体のことはまた時間の空いたときに書きます。

ソースコード汚いですよね。

ワードプレスのせいでインデントがおかしくなってしまう。

基礎文法をサンプルコードや文章で解説しています。

変数と型と演算子

インクリメント デクリメント

vb-net入門-三項演算子 IIf関数 If演算子

値型と参照型

構造体

IfとSelect Case条件文

For NextとFor Each条件文

Do While Loop条件文

イベント

イベントハンドラの追加と削除

デリケート

マルチキャストデリケート

ラムダ式

クラス

継承

隠蔽

ポリモーフィズム

抽象クラスと抽象メソッド

インターフェース

ジェネリック

LINQ

例外処理

配列

コレクション

サブルーチンとファンクション

PR



 - 基礎文法

Translate »