C#では、構造体は値型ですが、new
参照型であるかのように使用できます。どうしてこれなの?
5 に答える
彼らはコンストラクターを持っているからです。
new
演算子は「これは参照型です」という意味ではありません。「この型にはコンストラクターがある」という意味です。インスタンスを作成するときはnew
、インスタンスを作成し、その際にコンストラクターを呼び出します。
さらに言えば、すべての値型と参照型にはコンストラクターがあります(型自体が引数を定義していない場合、少なくともデフォルトのコンストラクターは引数を取りません)。
new
演算子は、参照型にのみ使用できることを意味するものではありません。値型でも使用できます。
オブジェクトを作成し、コンストラクターを呼び出すために使用されます。
すべての値型には暗黙的にパブリックデフォルトコンストラクタがあるため、すべての値型にはデフォルト値があります。デフォルト値の表を読むことができます。
例えば;
int i = new int(); // i will be 0 for because its default values.
構造体タイプのデフォルト値。
すべての値型フィールドをデフォルト値に設定し、すべての参照型フィールドをnullに設定することによって生成される値。
また、MSDNから:
new演算子を使用して構造体オブジェクトを作成すると、そのオブジェクトが作成され、適切なコンストラクターが呼び出されます。クラスとは異なり、構造体はnew演算子を使用せずにインスタンス化できます。newを使用しない場合、フィールドは割り当てられないままになり、すべてのフィールドが初期化されるまでオブジェクトを使用できません。
整数を「新規」にすることもできます。
違いは、参照クラスを値で渡すことができないことです。
ここにMSDNドキュメントで記載されているように、演算子new
は値型のデフォルトコンストラクターを呼び出すために使用されます。
構造体を作成するためにnew演算子を使用する必要はありません。これを行うとコンストラクターが呼び出され、そうでない場合はすべてのフィールドが未割り当てのままになります。