2016-09-04 6 views
0

静的変数をテストしているのですが、なぜスタティックな "int"結果が0(ゼロ)で、スタティックでない結果がコンパイルエラーになるのか驚いていました。C#unassigned static int結果がゼロになる

は、出力がスタティック

static void Main() 
    { 
    int i; 
    Console.Write("Value of i = " + i); 
    Console.ReadKey(); 
    } 

そしてこれの出力は、時間の誤差に

をコンパイルする結果となるの除去と

Value of i = 0 

ケース2の場合1

static int i; 
    static void Main() 
    { 
    Console.Write("Value of i = " + i); 
    Console.ReadKey(); 
    } 

考えてみましょう

Error 1 Use of unassigned local variable 'i' 

ここでは、両方のケースが最初の1つの結果が0になり、もう1つの結果が0になり、もう1つがコンパイラエラーを取得します。

+0

2番目のスニペットがC#の「明確な割り当てルール」に失敗しました。変数が常に初期化されることを検証するルール。しかし、それには限界があり、静的変数を初期化するどこか他の場所でコード化するかもしれないと簡単には分かりません。正確にするのはあまりにも困難です。ローカル変数、 'out'キーワードで宣言されたパラメータ、およびインスタンス変数によって使用されるstruct型のフィールドでのみ機能します。言語仕様の第5.3.2章。それ以外の場合は、静的変数は常に0またはnullに初期化されることを強く保証します。 –

答えて

2

C#言語の定義では、型には「既定値」があります。これは、何か他のものを代入しないと型に割り当てられます。数値にはデフォルト値の0、真偽値 - 偽、参照型 - null、構造体 - 各メンバの型があります。

+0

が合意しました!私は静的を削除する場合はどうすればいいですか? – ViZ

+0

@ViZ **フィールド**(静的であるかどうかにかかわらず)**常に**慣例により**初期化されます。 **ローカル変数**は異なります。**あなたがそうしない限り、**初期化されません。 –

+0

@SirRufoしかし、メモリ割り当ての点でどう違いますか? – ViZ

関連する問題