2010-11-28 6 views

答えて

13

これは、デフォルトを呼び出すことにより、パラメータなしのコンストラクタをタイプAの新しいインスタンスを作成します。

A a = new A(); 

これは、変数aにタイプAのデフォルト値を割り当て、で任意のコンストラクタを呼び出すことはありません。すべて:

A a = default(A); 

主な違いは、タイプのデフォルト値は、参考のためにnullすべての値タイプの0ビット値である(default(int)0default(bool)falseなどとなります)。

+6

@Fermaref - どこにいるのかわかりません。 'var x = default(TestClass);'は 'x'に' null'を代入します –

+0

大丈夫、私は間違いを犯しました。私は、型名ではなく、それを使用しようとしたときに型パラメータ値を提供しました。これはジェネリックでしか機能しません。ごめんなさい。 – Femaref

0

新しいキーワードは、常に参照タイプのメモリ割り当てを通知します。作成しようとしているデータのメモリ内に実際にスペースを作成する構造体はありません。値型の場合、関数またはプロシージャで使用されると、そのメモリは常に事前に割り当てられます。 defaultキーワードを使用すると、ジェネリック型は既定値(初期化されていない)を返すことができ、参照型はnullになります。

+0

value-typeのデフォルト値は初期化されていません。ゼロに初期化されます。 – CodesInChaos

+0

あなたは正しいですが、初期化されていないことを意味するものは、(int i = 100;のように)ユーザによって初期化されるのではなく、コンパイラによって初期化されます。混乱をおかけして申し訳ありません。 – ja72

2

値型のデフォルトコンストラクタは常にデフォルト(T)と等しいため、値型の違いはありません。 0null0.0 ...すべてのものを埋めるだけです。.netのデフォルトの実装では、これは変数のすべてをバイナリゼロで埋めることに相当します。

参照型の場合new T()はデフォルトコンストラクタを呼び出し、(通常は)非null参照を返します。これに対して、
default(T)は、nullと等価です。

default(T)は、Tが参照型であるか値型であるかにかかわらず、Tの有効な値を表すため重要です。これは汎用プログラミングで非常に便利です。
たとえば、FirstOrDefaultのような関数では、列挙型にエントリがない場合に結果に有効な値が必要です。そして、すべてのタイプで唯一有効なので、default(T)を使用してください。

さらに、参照型でデフォルトコンストラクタを呼び出すには、ジェネリック制約が必要です。すべてのreference-typeがデフォルトのコンストラクタを実装するわけではありません。あなたはいつもそれを使うことはできません。

関連する問題