C# 入門 & 実践 / C sharp

3-19. 構造体( struct ) とクラス( class )の違い。


構造体は、軽量だそうです。

構造体=値型
クラス=参照型

構造体が、ボックス化を多用する以外は、構造体のほうが軽い。

・コンストラクタが引数を持たなければいけない。
・インスタンス部分で値を変数に初期化代入できない。

値型と参照型の違いを見てみましょう。

    class Hello
    {
        private int x = 0;
        public Hello()
        {
        }
        public Hello( int x )
        {
            this.x = x;
        }
        public int X
        {
            get { return x; }
            set { x = value; }
        }
    }

    class Tester
    {
        static public void ChangeX(Hello h)
        {
            h.X = 100;
        }
        static void Main(string[] args)
        {
            Hello h = new Hello( 1 );
            ChangeX(h);
            Console.WriteLine("x = {0}",h.X );
            

        }
    }
この結果は参照型のため、渡したクラス自体の値がかわります。
1: x = 100
2: x = 100
となります。

    // 構造体バージョン!
    struct Hello
    {
        // ここで変数の初期化は出来ない!
        // private int x = 0;
        private int x;

        // 引数の無いコンストラクタは使用できない!
        //public Hello()
        //{
        //}
        public Hello( int x )
        {
            this.x = x;
        }
        public int X
        {
            get { return x; }
            set { x = value; }
        }
    }

    class Tester
    {
        static public void ChangeX(Hello h)
        {
            h.X = 100;
            Console.WriteLine("1: x = {0}", h.X);
        }
        static void Main(string[] args)
        {
            Hello h = new Hello( 1 );
            ChangeX(h);
            Console.WriteLine("2: x = {0}",h.X );
            

        }
    }

値型のため!ChangeX 内では 100 だが、元の Main のなかは 1 のまま
1: x = 100
2: x = 1

試しに ref 参照渡しをしてみる。

    struct Hello
    {
        // ここで変数の初期化は出来ない!
        // private int x = 0;
        private int x;

        // 引数の無いコンストラクタは使用できない!
        //public Hello()
        //{
        //}
        public Hello(int x)
        {
            this.x = x;
        }
        public int X
        {
            get { return x; }
            set { x = value; }
        }
    }

    class Tester
    {
        // ref をつけて参照渡しを明記
        static public void ChangeX(ref Hello h)
        {
            h.X = 100;
            Console.WriteLine("1: x = {0}", h.X);
        }
        static void Main(string[] args)
        {
            Hello h = new Hello(1);
            // ref をつけて参照渡しを明記
            ChangeX(ref h);
            Console.WriteLine("2: x = {0}", h.X);


        }
    }

当然の結果^-^。

1: x = 100
2: x = 100

あとは使い分けですね。それが難しいところですが。
構造体は、値、クラスは、クラス。って意味なんですよね・・・




3-18. 変換演算子(キャスト)オーバーロード / implicit / explicit « 3. C# 入門 / 基礎、型、文法、基本? » 3-20. Interface / インターフェイスの実装

C# 入門 & 実践 / C sharp