2012-03-05 9 views
3

宣言後の整数値(int)などの初期値ではない値は何ですか? "CLR vi C#"では、Richterが書き込みます。値の型は0で初期化されますが、使用は許可されません。 したがって、この.net value type initialization

int testVar; 

そして、どのようにチェックを初期化するメカニズムが実装されているように、変数の宣言の後にメモリに何になりますか?

答えて

5

タイプはすべてゼロであるメモリで初期化されます。私はこれがすべての値型の仕様に従っているかどうかはわかりませんので、チェックしない限り、この値を数えることはできません。異なる値型の場合、メモリ内のゼロは、その型が表すものによって異なるものを意味する可能性があります。

値の型は自動的に初期化され、ローカル変数ではなくクラスのフィールドである場合に使用できます。私が知る限り、CLR自体に初期化チェックはありません。初期化チェックはコンパイラによって実行され、初期化されていない変数が使用されている場合はコンパイル時エラーが報告されます。

+0

+1このチェックは* C#コンパイラ*の機能です。CLRにそのようなチェックはありません – BrokenGlass

+0

私はあなたを正しく理解していれば、例えば整数変数を宣言するILコードを書くことができ、初期化された変数? –

+0

はい、私はそう信じています。変数の宣言は実行ステップではありません。これは、ソースコードで焼いたものです。一方、初期化は実行ステップです。これは、宣言を持つ行にブレークポイントを置くことはできませんが、初期化は行いません。 – Stilgar

0

私が知る限り、この特定の型がどのようにバイトを必要とするかによって、宣言はいくつかのメモリを予約します。これらのバイトは理論的には、ハードウェアの特定のバイトを物理的に占有していたものをランダムに埋め込むことができます。

+0

はい、宣言はいくつかのメモリを予約しますが、初期化の前にそれを正確に保存するのは問題です。クラスフィールドとして 'int'を使うと、デフォルトで0で初期化されます。 –

+1

いいえ、ランダムに入力することはできません。 .NETにはありません。 – Stilgar

+0

20年前の変数宣言について学んだので事は少し変わりました... ;-) – Lindan

0

c#では、Nullable変数(Int32?intAux)のように、null値を持つ変数を使用できるタイプもあります。この型は最初はnullになります。それ以外の場合、Int32変数はnull値を持つことを許可しません。

変数が初期化されているかどうかを確認したり、(intAux == null)のようにすることができます。

+0

ありがとうございますが、私はこれを知っています。私の質問は、変数を宣言した後にIN MEMORYに格納されているものですが、値を代入する前ですか? –

+2

Nullable型は、boolフィールドHasValueと通常フィールドを持つ構造体として実装されています。それでもこれらの型はすべてゼロで初期化されます。 boolが0のときに起こるので、実際にはfalseであるため、HasValueはfalseで、これは変数が参照型nullとは異なるnullになる方法です。 – Stilgar

関連する問題