構造体についての質問です。構造体型の変数/オブジェクト (どちらが適しているかわからない) または構造体の配列またはリストを宣言するとき、オブジェクトのように明示的にコンストラクターを呼び出す必要がありますか、それとも変数のように宣言するだけで十分ですか?
2 に答える
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 };
Struct はValue Type
C# にあるため、ヒープではなくスタック メモリを使用します。
通常の方法で構造体変数を宣言できますint a = 90;
。
int は C# の構造体型です。
operatorを使用するnew
と、対応するコンストラクターが呼び出されます。