2011-01-06 22 views
1

私は、以下のコードから、タイプAの静的フィールドはデフォルトでnullになりますが、その型の変数は少なくともNULL値に初期化する必要があることがわかります。誰もその違いをもう少し説明できますか?ありがとうなぜ静的フィールドはデフォルトでnullですか?

class Program 
{ 
    static A _a; //it is null by default 
    static void Main(string[] args) 
     { 
      A nonStaticA; //empty reference, exception when used 
      A correctA=null; 
     } 
} 
class A 
{ 
} 
+2

これは静的フィールドではなく、デフォルト値(nullの場合はnull、数字の場合は0、boolの場合はfalseなど)に初期化されるすべてのフィールド(クラスレベルの変数)です。 –

+1

他にどんな価値があるでしょうか? – dvhh

+0

Lojは、関数変数のように静的メンバのコンパイル警告/エラーがないことを意味していると思います。これは、コンパイラは静的メンバーがどこかで初期化されていないと想定できないためです(実際にはできますが、そうではありません)。ローカル変数の場合、コンパイラは初期化されていないと不満を持ちます。 –

答えて

1

ローカル変数とフィールドの違いは、スタティックとインスタンスの間ではなく、です。

任意の型のローカル変数は、最初に値を使用する前に初期化する必要があります。これにより、変数の初期化を忘れたバグを防ぐことができます。

フィールドは宣言時にすべてのフィールドを初期化することができないため、別の問題です。たとえば、初期値はコンストラクタの引数に依存することがあります。したがって、フィールドは明示的に初期化する必要はありません。そうでない場合は、タイプのデフォルト値を取得します。すべての参照タイプに対してnullです。

2

staticとは関係ありません。クラスフィールド(インスタンスと静的)はデフォルトに初期化され、ローカル変数は初期化されません。

なぜですか?多くのことのように、それはある時点で設計上の決定でした。

4

フィールドの初期値は、静的フィールドであるかインスタンスフィールドであるかにかかわらず、がフィールドの型のデフォルト値です。このデフォルトの初期化が行われる前にフィールドの値を観測することはできません。したがって、フィールドは決して「初期化されていません」。

静的コンストラクターがクラスに存在する場合、その静的コンストラクターを実行する直前に静的フィールド初期化子が実行されます。それ以外の場合、静的フィールド初期化子は、そのクラスの静的フィールドを最初に使用する前の実装依存の時間に実行されます。

ローカル変数は自動的に初期化されないため、デフォルト値はありません。確定的な代入チェックの目的で、ローカル変数は最初は未割り当てとみなされます。

0

C#は、私が観察できる限り、他の以前の言語(主にC++)のように多くのものを保持していました。

C++に関連する理由は、静的(またはグローバル)オブジェクトが実行可能ファイルまたはライブラリに静的に書き込まれるということです。他のオブジェクトでは、オブジェクトを作成するコード(オブジェクト自身)が実行可能ファイルまたはライブラリに書き込まれます。スタック上のオブジェクトの場合、通常、スタックポインタからある値を減算するコードが記述されます。

実行可能ファイルまたはライブラリがOSによってメモリにロードされると、静的フィールドはメモリにそのままコピーされます(プロセスのデータセグメント)。それらはそのままコピーされるので、すでに値(実行可能ファイルまたはライブラリファイルの値)を持っています。そのため、特定の値に設定することはパフォーマンス上の影響はありません。その理由から(私が見る限り)、C++標準は(それらが明示的に初期化されていなければ)確定的な値を出し、初期値としてゼロよりも自然なものは何か?

動的オブジェクト(スタックまたはヒープ上にあるかどうか)を初期化するには、実行可能ファイルまたはライブラリにコードを挿入する必要があります。これはパフォーマンスに影響を及ぼします(そしておそらく他の意味合いもあります)ので、C++標準ではプログラマに任せていました。

私はこのデータのすべてのビットが真実であるかどうかは完全にはわかりませんが、私が知っているところから私にとって論理的に思われるものです。