VB.NET や C# でも構造体を使用することができます。構造体はクラスと似ており、クラス同様に、メソッド、プロパティ、インターフェースおよびコンストラクタまでも実装可能です。構造体(VB.NET : Structure / C# : struct)の初期化には、 型として定義して各メンバー変数を初期化する方法と、コンストラクタを使って初期化する方法がありますが、new ステートメントを使って構造体を初期化した場合に、VB.NET と C# で挙動が異なる動作をするので 注意が必要です。なお、ここで掲載しているサンプルは、Visual Studio 2008 ( .Net Framework3.5 ) で動作確認を行っています。
スポンサーリンク
構造体の初期化サンプル
VB.NET
'------------------------------------------------
' 構造体定義
'------------------------------------------------
Structure PersonStruct
Implements IDisposable
'メンバー変数定義
Public Name As String
Public Age As Integer
'構造体が New で初期化された場合用のコンストラクタ
Sub New(ByVal name As String, ByVal age As Integer)
Me.Name = name
Me.Age = age
End Sub
'名前と年齢を連結して返す
Public Function NameAndAge() As String
Return Me.Name + "(" + Me.Age.ToString() + ")"
End Function
'名前と年齢を設定する
Public Sub SetNameAndAge(ByVal name As String, ByVal age As Integer)
Me.Name = name
Me.Age = age
End Sub
'IDisposable インターフェースの実装
Public Sub Dispose() Implements System.IDisposable.Dispose
Console.WriteLine("Dispose がコールされた。")
End Sub
End Structure
'------------------------------------------------
' 初期化方法
'------------------------------------------------
' 1.構造体を初期化する方法
Dim ps As PersonStruct
ps.Name = "私の名前"
ps.Age = 33
Console.WriteLine(ps.NameAndAge())
'正常に値は変更される
ps.SetNameAndAge("私の名前を変更する", 30)
Console.WriteLine(ps.NameAndAge())
' 2.コンストラクタを使用して構造体を初期化する方法
' この方法では、コンストラクタ以外で変数を初期化できない
Using ps2 As New PersonStruct("あなたの名前", 44)
Console.WriteLine(ps2.NameAndAge())
' New で初期化すると、エラーにはならないが、構造体内部の値は変化しない
’(例外でも発生してくれるとうれしいのだが・・・)
' New で初期化した場合は、内部のメンバ変数が ReadOnly として扱われる
ps2.SetNameAndAge("あなたの名前を変更する", 40)
Console.WriteLine(ps2.NameAndAge())
End Using
C#
//-----------------------------------------------
// 構造体定義
//-----------------------------------------------
struct PersonStruct : IDisposable
{
// メンバー変数定義
public string Name;
public int Age;
// 構造体が new で初期化された場合用のコンストラクタ
public PersonStruct(string name, int age)
{
this.Name = name;
this.Age = age;
}
// 名前と年齢を連結して返す
public string NameAndAge()
{
return this.Name + "(" + this.Age.ToString() + ")";
}
// 名前と年齢を設定する
public void SetNameAndAge(string name, int age)
{
this.Name = name;
this.Age = age;
}
// IDisposable インターフェースの実装
public void Dispose()
{
Console.WriteLine("Dispose がコールされた。");
}
}
//-----------------------------------------------
// 初期化方法
//-----------------------------------------------
// 1.構造体を初期化する方法
PersonStruct ps;
ps.Name = "私の名前";
ps.Age = 33;
Console.WriteLine(ps.NameAndAge());
// 正常に値は変更される
ps.SetNameAndAge("私の名前を変更する", 30);
Console.WriteLine(ps.NameAndAge());
// 2.コンストラクタを使用して構造体を初期化する方法
using (PersonStruct ps2 = new PersonStruct("あなたの名前", 44))
{
Console.WriteLine(ps2.NameAndAge());
//-----------------------------------------------
// VB と挙動の差異
//-----------------------------------------------
// VB と異なり、new で初期化しても後でメンバー変数の値を変更できる
ps2.SetNameAndAge("あなたの名前を変更する", 40);
Console.WriteLine(ps2.NameAndAge());
}