web-dev-qa-db-ja.com

構造体が値型である場合、なぜそれを新しくすることができますか?

C#では、構造体は値型ですが、参照型であるかのようにnewすることができます。どうしてこれなの?

23
Sachin Kainth

コンストラクターがあるからです。

new演算子 は「これは参照型です」という意味ではありません。 「この型にはコンストラクターがある」という意味です。何かをnewすると、インスタンスが作成され、その際にコンストラクターが呼び出されます。

さらに言えば、all値型と参照型にはコンストラクターがあります(少なくとも、型自体が引数を定義していない場合、引数をとらないデフォルトのコンストラクター) 。

35
BoltClock

new演算子は、参照型にのみ使用できることを意味するものではありません。 値型でも使用できます。

から 新しい演算子

作成に使用オブジェクトおよびコンストラクターの呼び出し

すべての値型には暗黙的にパブリックデフォルトコンストラクターがあるため、すべての値型にはデフォルト値があります。 デフォルト値テーブル を読むことができます。

例えば;

int i = new int(); // i will be 0 for because its default values.

構造体タイプのデフォルト値。

すべての値型フィールドをデフォルト値に設定し、すべての参照型フィールドをnullに設定することによって生成される値。

また、From [〜#〜] msdn [〜#〜]

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

16
Soner Gönül

整数を「新規」にすることもできます。
違いは、参照クラスを値で渡すことができないことです。

4
Yochai Timmer

正しいと書かれています here MSDNドキュメントでは、new演算子を使用して値型のデフォルトコンストラクターを呼び出しています。

3
user203570

構造体を作成するためにnew演算子を使用する必要はありません。これを行うとコンストラクターが呼び出され、そうでない場合はすべてのフィールドが未割り当てのままになります。

1
Daniel Wardin