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()); }