構造体とは
複数の値をまとめて格納できる型です。
関連するモノをいちいち変数を宣言してもわかりにくいですよね。
基本的にはクラスでできることは構造体でも多分できます。
備考: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と出力パネルに表示さえます。
結果だけみるとインスタンスを使用してアクセスしたときなのかな?
コンストラクタには初期化処理を書いたりします。
列挙体のことはまた時間の空いたときに書きます。
ソースコード汚いですよね。
ワードプレスのせいでインデントがおかしくなってしまう。