4

構造体についての質問です。構造体型の変数/オブジェクト (どちらが適しているかわからない) または構造体の配列またはリストを宣言するとき、オブジェクトのように明示的にコンストラクターを呼び出す必要がありますか、それとも変数のように宣言するだけで十分ですか?

4

2 に答える 2

13

C# の構造体は、コンストラクターを呼び出すかどうかに関係なく作成できます。コンストラクターが呼び出されない場合、構造体のメンバーはデフォルト値に初期化され (基本的にゼロに設定されます)、structすべてのフィールドが初期化されるまで使用できません。

ドキュメントから:

new 演算子を使用して構造体オブジェクトを作成すると、それが作成され、適切なコンストラクターが呼び出されます。クラスとは異なり、構造体は new 演算子を使用せずにインスタンス化できます。new を使用しない場合、フィールドは未割り当てのままになり、すべてのフィールドが初期化されるまでオブジェクトを使用できません。

以下にいくつかの例を示します。

struct Bar
{ 
   public int Val;  

   public Bar( int v ) { Val = v; }
}

public void Foo()
{
    Bar z;      // this is legal...
    z.Val = 5;

    Bar q = new Bar(5); // so is this...
    q.Val = 10;

    // using object initialization syntax...
    Bar w = new Bar { Val = 42; }
}

構造体の配列は、単一の構造体変数とは異なります。構造体型の配列を宣言するときは、参照変数を宣言しています。そのため、new演算子を使用して割り当てる必要があります。

Bar[] myBars = new Bar[10];  // member structs are initialized to defaults

構造体にコンストラクターがある場合は、配列の初期化構文を使用することもできます。

Bar[] moreBars = new Bar[] { new Bar(1), new Bar(2) };

これよりも洗練されたものにすることができます。プリミティブ型からの暗黙の変換演算子がある場合structは、次のように初期化できます。

struct Bar
{ 
   public int Val;  

   public Bar( int v ) { Val = v; }

   public static implicit operator Bar( int v )
   {
       return new Bar( v );
   }
}

// array of structs initialized using user-defined implicit converions...
Bar[] evenMoreBars = new Bar[] { 1, 2, 3, 4, 5 };
于 2010-05-05T03:43:17.130 に答える
0

Struct はValue TypeC# にあるため、ヒープではなくスタック メモリを使用します。

通常の方法で構造体変数を宣言できますint a = 90;

int は C# の構造体型です。

operatorを使用するnewと、対応するコンストラクターが呼び出されます。

于 2010-05-05T06:13:39.280 に答える