class と struct の違い

C# で class と struct の違いを検証します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. struct と object class は良く似ていますが、全く同じではありません。
    class がポインタで渡されるのに対して、struct は値が渡されます。
    ポインタが渡された場合は、ポインタを通じて元の値が変更されますが、値が渡されたときは元のデータに影響しません。
    そのへんの所をプログラムで確かめてみましょう。
  2. pnt に生成した Point struct を pnt2 に代入すると値が渡されます。
    pnt2 の値を変更しても、元の pnt の値には影響しません。
    同じプログラムを class で確かめて下さい。
  3. ソースコードです。
    /********************************/
    /*★ struct Sample    前田 稔 ★*/
    /********************************/
    using System;
    
    class console
    {
        public static void Main()
        {
            Point   pnt = new Point();
            Point   pnt2;
    
            pnt.x = 123;
            pnt.y = 45;
            Console.WriteLine("pnt.xypos= {0}",pnt.xypos());
            pnt2= pnt;      // 値が渡される
            pnt2.x = 7;     // pnt には影響しない
            Console.WriteLine("pnt.xypos= {0}",pnt.xypos());
            System.Console.ReadLine();
        }
    }
    
    struct Point
    {
        public  int x;
        public  int y;
    
        public string xypos()
        {
            return "X:" + x.ToString() + ", Y:" + y.ToString();
        }
    }
    
  4. class Point のときの実行結果です。
        pnt.xypos= X:123, Y:45
        pnt.xypos= X:7, Y:45
        
  5. struct Point のときの実行結果です。
        pnt.xypos= X:123, Y:45
        pnt.xypos= X:123, Y:45
        
  6. 構造体では Instructor は使えますが、Destructor は使えません。
    構造体で定義した領域の既定値は public ですが、Class は private です。
    構造体は、構造体やクラスを継承することはできません。また、継承元になることもできません。

struct(class)の代入

  1. struct と class を代入するときにも違いが生じます。
    /***************************************/
    /*★ struct(class) の代入    前田 稔 ★*/
    /***************************************/
    using System;
    
    class console
    {
        public static void Main()
        {
            Obj s1 = new Obj();
            Obj s2;
            s1.X = 1;
            s1.Y = 2;
            s2 = s1;
            Console.WriteLine("s2.X={0}  s2.Y={1}  s1.X={2}", s2.X, s2.Y, s1.X);
            s1.X = 123;
            Console.WriteLine("s2.X={0}  s2.Y={1}  s1.X={2}", s2.X, s2.Y, s1.X);
            System.Console.ReadLine();
        }
    }
    
    struct Obj
    {
        public int X;
        public int Y;
    }
    
  2. Obj s1 を定義して X=1, Y=2 を格納します。
        Obj s1 = new Obj();
        s1.X = 1;
        s1.Y = 2;
    
    Obj s1 を Obj s2 に代入してから s1 の X を 123 に変更します。
        Obj s2;
        s2 = s1;
        s1.X = 123;
    
  3. Obj s2 は Obj s1 の影響を受けません。
    このプログラムの実行結果です。
        s2.X=1  s2.Y=2  s1.X=1
        s2.X=1  s2.Y=2  s1.X=123
        
  4. struct を class に変更してみて下さい。
        //struct Obj
        class Obj
        
    Obj s2 が Obj s1 の影響を受けて、実行結果が次のように変わります。
        s2.X=1  s2.Y=2  s1.X=1
        s2.X=123  s2.Y=2  s1.X=123
        

前田稔(Maeda Minoru)の超初心者のプログラム入門