構造体 [VB.NET]
作成日:2022/5/5
参考
配列に構造をつける。
- クラスに似ている
- メソッドやプロパティを持つことができる。
- 違いは、クラスが参照型。構造体が値型。
-
構造体は値型であるためにNewなどを使って明示的にインスタンス化する必要はありません。もちろんコンストラクタを呼び出すときにはNewを使用しますが、この場合でもインスタンスを作成すると言うよりはコンストラクタを呼び出すと言う意味合いになります。
- 構造体はStructureステートメントを使って宣言する。
構造体
構造体とは既存のデータ型を組み合わせた構造を持つ型のことです。 構造体では複数の値(データ型)を組み合わせることにより、それらに意味を持たせた一つの型を作成することができます。 VB6以前でユーザー定義型と呼ばれていたものは、VB.NETでは構造体という名称に変わり、クラスと同様に構造体がプロシージャ(メソッド)を持つことができるようになっているなど、機能も大幅に強化されています。
構造体を宣言する際の命名基準について、VB.NETでは構造体の場合もクラスと同様の命名方法、つまりすべて大文字からなる名前は付けないようにガイドラインで定められています。 (例えば、RECTよりはRectが推奨される) ただ、あくまで指針であるので、わかりやすさが維持される限りは自由に名前を付けることができます。
構造体の宣言
構造体(Structure)は下記のように定義する。
(見分けやすい様にコメント部は緑色で表示している。)
Public Class Form1
Structure 出席者
Dim 出席番号 As Integer
Dim 氏名 As String
Dim 年齢 As Integer
End Structure
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' メソッド内(この場合はSubプロシージャ内)にStructureの宣言を記述してはならない。
End Sub
End Class
- 「Structure△名称」と「End△Structure」の間で構造体を定義する。
- この宣言はメソッド(プロシージャ)の外で行わなければならない。
- 構造体内の変数(出席番号、氏名、年齢)はアクセス修飾子(この場合はDim)を用いて宣言されている。
- アクセス修飾子はDimやPublic、Privateなどを使用することができる。
- アクセス修飾子Dimで宣言した構造体のメンバはPublicと同じアクセス範囲となる。
この構造体の使用例
(見分けやすい様にコメント部は緑色で表示している。)
Public Class Form1
Structure 出席者 ' (1) 構造体「出席者」を宣言している。
Dim 出席番号 As Integer
Dim 氏名 As String
Dim 年齢 As Integer
End Structure
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim 出席者一覧 As 出席者 ' (2) 変数「出席者一覧」を宣言している。
出席者一覧.出席番号 = 123 ' (3) 変数「出席者一覧」の各メンバーに値を設定する。
出席者一覧.氏名 = "誰の誰兵衛"
出席者一覧.年齢 = 25
Debug.WriteLine(出席者一覧.氏名) ' (4) 確認のために氏名を表示している。
End Sub
End Class
-
(2) 変数「出席者一覧」を宣言している。
出席者一覧の型は、前項で宣言した「出席者」である。
-
(3) 変数「出席者一覧」の各メンバーに値を設定する。
変数「出席者一覧」は「出席者」の構造体宣言により、3つのメンバー(フィールド)を持っている。
ここでは、それぞれのフィールドに値をセットしている。
-
構造体の型を持つ変数の場合は、「変数名.フィールド名」の形式でフィールドを参照する。
-
(4) 確認のために氏名を表示している。
ここでは、氏名フィールドの内容を表示している。
先程セットした”誰の誰兵衛”が表示される。
-
このように、
構造体の型を持つ変数の場合は、
「変数名.フィールド名」の形式でフィールドを記述して、
値を設定したり、参照することができる。
この構造体の使用例(配列で使用している)
前項で構造体の使用法を解説した。
構造体の型を持つ変数は、配列で宣言することも多い。
ここでは、前項の場合と同様の例で、構造体「出席者」を使用している変数が配列である場合の例を解説する。
ただし、前項との違いは2箇所だけである。(説明文の解説箇所と下記の使用例の該当箇所を赤で表示している)
変数の宣言時に配列の要素数を指定する。
フィールドの参照時にインデックス(添字)を指定する。
(見分けやすい様にコメント部は緑色で表示している。)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim 出席者一覧(21) As 出席者 ' (1) 変数(配列)「出席者一覧」を宣言している。
出席者一覧(5).出席番号 = 123 ' (2) 変数「出席者一覧」の各メンバーに値を設定する。
出席者一覧(5).氏名 = "誰の誰兵衛"
出席者一覧(5).年齢 = 25
Debug.WriteLine(出席者一覧(5).氏名) ' (3) 確認のために氏名を表示している。
End Sub
End Class
-
「出席者一覧」という名前の変数(配列)を宣言している。
これは、要素数が21個の配列である。
-
「出席者一覧」という名前の変数(配列)のインデックス(添字)=5のフィールドに値をセットしている。
インデックス(添字)はゼロから始まるので、この例では6番目にセットしている。
構造体にメソッドを持たせる
構造体にはメソッドを持たせることができる。
「この構造体の使用例」では、
個々のメンバに値をセットしているが、
ここでは全て(3個)のメンバに値をセットするメソッドを追加する。
(見分けやすい様にコメント部は緑色で表示している。)
Public Class Form1
Structure 出席者 ' (1) 構造体「出席者」を宣言している。
Dim 出席番号 As Integer
Dim 氏名 As String
Dim 年齢 As Integer
' (2)メソッドの追加
Sub 出席者情報のセット(ByVal 出席番号 As Integer,
ByVal 氏名 As String,
ByVal 年齢 As Integer)
Me.出席番号 = 出席番号
Me.氏名 = 氏名
Me.年齢 = 年齢
End Sub
End Structure
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim 出席者一覧 As 出席者 ' (3) 変数「出席者一覧」を宣言している。
出席者一覧.出席者情報のセット(123, "誰の誰兵衛", 25) ' (4) 変数「出席者一覧」の各メンバーに値を設定する。
Debug.WriteLine(出席者一覧.氏名) ' (5) 確認のために氏名を表示している。
End Sub
End Class
-
' (2)メソッドの追加
-
「出席者情報のセット」という名称のメソッドを追加する。
このメソッドは3個の引数を受け取って、
構造体「出席者」の各メンバ変数にセットしている。
-
「Me.出席番号」などのMeキーワードは、
構造体のメンバ変数である「出席番号」を参照するためのキーワードである。
つまり、
構造体のメンバ変数にも、メソッドの引数にも「出席番号」という名称が定義されているため、
構造体のメンバ変数を参照する場合にMeキーワードを指定している。
名称が違った場合、
つまり、
引数の名称が「引数_出席番号」となっているような場合は、
Meキーワードを指定する必要はない。
-
' (3) 変数「出席者一覧」を宣言している。
-
' (4) 変数「出席者一覧」の各メンバーに値を設定する。
「出席者情報のセット」を呼び出し、値をセットしている。
-
' (5) 確認のために氏名を表示している。