[ VB.NET / C# ]構造体の初期化 ( VB.NET : Structure / C# : struct )

Pocket

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

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *