構造体は、必ずnewでインスタンスを作り必要がありますか?


構造体は必ずしも new キーワードを使用してインスタンスを作る必要はありません。C#では構造体(struct)は値型であり、new を使用しなくてもインスタンスを作成できます。ただし、構造体のインスタンスを作成する方法によって、動作や初期化の仕方に違いがあります。

1. new を使う場合

new キーワードを使うと、構造体のコンストラクターが呼び出され、すべてのフィールドが自動的に初期化されます。

public struct MyStruct
{
    public int X;
    public int Y;

    public MyStruct(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// 使用例
var myStruct = new MyStruct(10, 20);
Console.WriteLine(myStruct.X); // 10
Console.WriteLine(myStruct.Y); // 20

2. new を使わない場合

new を使わずに構造体を宣言すると、デフォルトの値(ゼロまたは null に相当する値)がフィールドに割り当てられます。ただし、初期化を行わない場合、その構造体のフィールドにはアクセスできません。

public struct MyStruct
{
    public int X;
    public int Y;
}

// 使用例
MyStruct myStruct;
myStruct.X = 10; // 明示的に初期化する必要がある
myStruct.Y = 20;

Console.WriteLine(myStruct.X); // 10
Console.WriteLine(myStruct.Y); // 20

この方法では、すべてのフィールドを初期化しないとコンパイルエラーが発生します。

MyStruct myStruct;
// Console.WriteLine(myStruct.X); // エラー: 使用する前にフィールドを初期化してください

注意点

  1. new を使うと初期化が保証される
    コンストラクターを呼び出すことで、フィールドの初期化が自動的に行われるため、安全です。
  2. new を使わない場合は自分で明示的に初期化が必要
    new を使わない場合、C#の仕様により、構造体のすべてのフィールドを個別に初期化する必要があります。初期化していないフィールドにアクセスしようとすると、コンパイルエラーが発生します。
  3. 構造体のデフォルト値
    default(MyStruct) を使用すると、すべてのフィールドがデフォルト値に初期化された状態の構造体インスタンスを取得できます。
MyStruct myStruct = default;
Console.WriteLine(myStruct.X); // 0
Console.WriteLine(myStruct.Y); // 0

結論

構造体は new を必ず使う必要はありません が、new を使ったほうが初期化ミスを防ぐことができ、安全性が高まります。特に、フィールドが多い場合や複雑な初期化が必要な場合は、new を使うことをお勧めします。