C#のstructについて

Java言語でもともと開発していた私が、JavaC#でユーザー定義の扱いが違う為、C#で開発している時にはまりそうな資料を見つけたのでここで紹介します。*1


Java では、ユーザ定義型は全て参照型で、C#のようにstructという値型が存在しません。
C# では、参照型も、値型でも作成できます。また、標準ライブラリの中に struct で定義されたものもあります。


ここでは、C#でstructで作成した場合の注意点と、参照渡しの方法を資料を元に簡単に説明します。

C#でのstructの扱い

C#のstructは、classと違い「値渡し」され、コピーして渡されます。

struct Point
{
    public int RegistPoint;

    public Point( int x )
    {
        this.RegistPoint = x;
    }
}
static void Regist(Point p)
{
    p.RegistPoint = 100;
}

static void Main()
{
    Point p = new Point(1);
    Regist(p);
    Console.WriteLine(p.RegistPoint);   // 1
}

Java開発者であれば、100が上書きされて、100が表示されると思ってしまいますが、
C#のstructの場合は、1が表示されます。

C#で参照渡しをする場合

C#でstructの参照渡しをする場合は、refを使用します。

struct Point
{
    public int RegistPoint;

    public Point( int x )
    {
        this.RegistPoint = x;
    }
}
static void Regist(ref Point p)
{
    p.RegistPoint = 100;
}

static void Main()
{
    Point p = new Point(1);
    Regist(ref p);
    Console.WriteLine(p.RegistPoint);   // 100
}

1を渡していますが、
初期設定値の、100が表示されるようになります。
このように、メソッドの仮引数と実引数の両方に ref をつけることで、参照渡しとなります。


C#でstruct(構造体)を使用する場合、値の扱いには注意が必要です。