2011-01-28 10 views
0

1)A a;
2)A a = null;次の二つの

との差額は、任意の違いはありますか?

+0

http://stackoverflow.com/questions/589920/default-value-of-a-variable-at-the-time-of-declaration-in-c-and-vb – alexandrul

答えて

5

ローカル変数の場合、最初の変数は絶対に割り当てられません。2番目の変数は絶対に割り当てられません。例えば:

void DoesntCompile() 
{ 
    A a; 
    string x = a.ToString(); // Can't use a - it's not definitely assigned 
} 

void CompilesButGoesBang() 
{ 
    A a = null; 
    string x = a.ToString(); // Throws a NullReferenceException 
} 

フィールド(静的またはインスタンス)のために、Aが参照型である場合、それはおそらく、任意の違いはありません。私はは、静的変数の場合の違いを実証するプログラムを書くことができますが、反射...厄介なを使用して静的型の初期化子を2回実行することに依存するでしょう。

あなたがなぜ尋ねているのかについてより多くの文脈を与えることができれば、それは本当に助けになるでしょう。

+0

私はちょうどC#参照型を宣言すると、デフォルトのnullはありません。私は値の型を宣言すると、それはデフォルト値を持っている必要があります、そう思いますか? – user496949

+0

@ user496949:いいえ、ローカル変数ではありません。 mutable構造体でできることはありますが、最初は空の変数にフィールドを代入しますが、 'int'のようなものを使用すると、ローカル変数と同じ動作が文字列ローカル変数と同じになります。 –

+0

@ user496949を*変数として扱います:no:値の型にも初期値がありません(割り当てられていない構造体のすべてのフィールドを*割り当てる*エッジケースの方法がありますが、 )。簡単な答えは、 "変数は初期値を持たず、フィールドは型のデフォルト値を取得" –

2

C#では、変数はhereのルールに従ってデフォルト設定されています。

これらの2つの主な違いは、ケース2の場合、変数が「確実に割り当てられた」と考えることができることです。変数の使用方法によっては、コンパイラが特定の操作を許可する前に、その変数を確実に割り当てる必要があるかもしれません。明確な割り当てについては、this noteを参照してください。

+0

それぞれの型はデフォルト値を持っているので、コンパイラが未割り当てのローカル変数を使用しないようにする理由は、次のことを理解したいだけです。 – user496949

+0

参考資料は*右*ですが、VS 2003のドキュメントから切り離す時間があるかもしれません。 –

+0

@ user496949両方の回答はすでにあなたに語っています。 "明確な割り当て" - これは仕様の中で(変数のために)要求されます。 –