私はA
という名前のクラスを持っています。これら2つのステートメントの違いは何ですか?デフォルトコンストラクタとデフォルトコンストラクタの違いは何ですか
A a = new A();
A a = default(A);
私はA
という名前のクラスを持っています。これら2つのステートメントの違いは何ですか?デフォルトコンストラクタとデフォルトコンストラクタの違いは何ですか
A a = new A();
A a = default(A);
これは、デフォルトを呼び出すことにより、パラメータなしのコンストラクタをタイプA
の新しいインスタンスを作成します。
A a = new A();
これは、変数a
にタイプA
のデフォルト値を割り当て、で任意のコンストラクタを呼び出すことはありません。すべて:
A a = default(A);
主な違いは、タイプのデフォルト値は、参考のためにnull
すべての値タイプの0ビット値である(default(int)
は0
、default(bool)
はfalse
などとなります)。
新しいキーワードは、常に参照タイプのメモリ割り当てを通知します。作成しようとしているデータのメモリ内に実際にスペースを作成する構造体はありません。値型の場合、関数またはプロシージャで使用されると、そのメモリは常に事前に割り当てられます。 default
キーワードを使用すると、ジェネリック型は既定値(初期化されていない)を返すことができ、参照型はnull
になります。
value-typeのデフォルト値は初期化されていません。ゼロに初期化されます。 – CodesInChaos
あなたは正しいですが、初期化されていないことを意味するものは、(int i = 100;のように)ユーザによって初期化されるのではなく、コンパイラによって初期化されます。混乱をおかけして申し訳ありません。 – ja72
値型のデフォルトコンストラクタは常にデフォルト(T)と等しいため、値型の違いはありません。 0
、null
、0.0
...すべてのものを埋めるだけです。.netのデフォルトの実装では、これは変数のすべてをバイナリゼロで埋めることに相当します。
参照型の場合new T()
はデフォルトコンストラクタを呼び出し、(通常は)非null参照を返します。これに対して、
default(T)
は、null
と等価です。
default(T)
は、Tが参照型であるか値型であるかにかかわらず、Tの有効な値を表すため重要です。これは汎用プログラミングで非常に便利です。
たとえば、FirstOrDefault
のような関数では、列挙型にエントリがない場合に結果に有効な値が必要です。そして、すべてのタイプで唯一有効なので、default(T)
を使用してください。
さらに、参照型でデフォルトコンストラクタを呼び出すには、ジェネリック制約が必要です。すべてのreference-typeがデフォルトのコンストラクタを実装するわけではありません。あなたはいつもそれを使うことはできません。
@Fermaref - どこにいるのかわかりません。 'var x = default(TestClass);'は 'x'に' null'を代入します –
大丈夫、私は間違いを犯しました。私は、型名ではなく、それを使用しようとしたときに型パラメータ値を提供しました。これはジェネリックでしか機能しません。ごめんなさい。 – Femaref