2013-03-08 6 views
19

は、私はこのような配列をインスタンス化:配列内のメンバーのデフォルト値は何ですか?

int array[] = new int[4]; 

これら4人のメンバーのデフォルト値は何ですか?それはヌルか0か存在しないのですか?

+3

試したときに何が起こりましたか? – jrummell

+6

'default(int)'、 'default(T)'ここで 'T'は配列に含まれる項目の型です。 –

+1

この質問を信じることはできません。 –

答えて

37

0です。nullは有効なint値ではないため、nullにすることはできません。 C#5仕様のセクション7.6.10.4から

:新しい配列インスタンスの

すべての要素は、それらのデフォルト値に初期化される(5.2)。

およびセクション5.2から:

変数のデフォルト値は、変数の種類に依存し、以下のように決定される:

値型変数について
  • デフォルト値は、value-typeのデフォルトコンストラクタ(4.1.2)によって計算された値と同じです。
  • 参照型の変数の場合、デフォルト値はnullです。

通常、初期値への初期化は、メモリマネージャまたはガベージコレクタに、使用のために割り当てられる前にメモリを全ビットゼロに初期化することによって行われます。このため、ヌル参照を表すために全ビット0を使用すると便利です。

は(実装の詳細としては、最初の箇条書きの周りにいくつかのtrickinessあります。C#の自体があなたが値型のためのパラメータのないコンストラクタを宣言することはできませんが、あなたは 値型のために独自のパラメータなしのコンストラクタを作成することができます Arrays (C# Programming Guide)からILで私はそれらのコンストラクタは配列の初期化に呼ばれているとは思わないが、彼ら C#で new X()式で呼び出されますそれはしかし、実際にはC#の仕様の領域外です)

+1

このページを読み込むと、「1分前に尋ねました」、「59秒前に回答しました」というメッセージが表示されます。 Jon Skeetが本当にボットであることの証拠? ;) –

+1

@TimGoodman:タイムスタンプを見ると、私は質問をしてから49秒後に(最初は、簡単なバージョンで)答えたと思います。まだ改善の余地がある。 –

+0

@JonSkeetあなたはその批評家に返信すべきではありません。それは馬鹿げたことですが(面白いですが)、それは褒め言葉です。 – Lucio

4

。。。:

数値配列要素のデフォルト値はゼロに設定され、参照要素はnullに設定されます。

0

整数はNULLにできません。彼らは値 '0'を持つでしょう。コードからNULLintに割り当てようとしても、それを行うことはできません。

+0

C#には 'NULL'というものはありません。 –

9

T型(配列要素やインスタンスフィールドなど)の自動初期化変数のデフォルト値は、default(T)の値と同じです。参照型とポインタ型の場合はnullです。数値型の場合は、その型のゼロです。ブールについては、それは間違いです。 struct型の場合は、すべてのフィールドがデフォルト値に初期化された構造体の値です。

+0

C#チームは、「デフォルトではない」パラメータのないコンストラクタを持つ他の言語で書かれた構造体を明示的に検討したり気にかけたりしましたか? –

+0

@JonSkeet:それは決して本当に起こったことはありません。 –

関連する問題