宣言後の整数値(int)などの初期値ではない値は何ですか? "CLR vi C#"では、Richterが書き込みます。値の型は0で初期化されますが、使用は許可されません。 したがって、この.net value type initialization
int testVar;
そして、どのようにチェックを初期化するメカニズムが実装されているように、変数の宣言の後にメモリに何になりますか?
宣言後の整数値(int)などの初期値ではない値は何ですか? "CLR vi C#"では、Richterが書き込みます。値の型は0で初期化されますが、使用は許可されません。 したがって、この.net value type initialization
int testVar;
そして、どのようにチェックを初期化するメカニズムが実装されているように、変数の宣言の後にメモリに何になりますか?
タイプはすべてゼロであるメモリで初期化されます。私はこれがすべての値型の仕様に従っているかどうかはわかりませんので、チェックしない限り、この値を数えることはできません。異なる値型の場合、メモリ内のゼロは、その型が表すものによって異なるものを意味する可能性があります。
値の型は自動的に初期化され、ローカル変数ではなくクラスのフィールドである場合に使用できます。私が知る限り、CLR自体に初期化チェックはありません。初期化チェックはコンパイラによって実行され、初期化されていない変数が使用されている場合はコンパイル時エラーが報告されます。
c#では、Nullable変数(Int32?intAux)のように、null値を持つ変数を使用できるタイプもあります。この型は最初はnullになります。それ以外の場合、Int32変数はnull値を持つことを許可しません。
変数が初期化されているかどうかを確認したり、(intAux == null)のようにすることができます。
ありがとうございますが、私はこれを知っています。私の質問は、変数を宣言した後にIN MEMORYに格納されているものですが、値を代入する前ですか? –
Nullable型は、boolフィールドHasValueと通常フィールドを持つ構造体として実装されています。それでもこれらの型はすべてゼロで初期化されます。 boolが0のときに起こるので、実際にはfalseであるため、HasValueはfalseで、これは変数が参照型nullとは異なるnullになる方法です。 – Stilgar
+1このチェックは* C#コンパイラ*の機能です。CLRにそのようなチェックはありません – BrokenGlass
私はあなたを正しく理解していれば、例えば整数変数を宣言するILコードを書くことができ、初期化された変数? –
はい、私はそう信じています。変数の宣言は実行ステップではありません。これは、ソースコードで焼いたものです。一方、初期化は実行ステップです。これは、宣言を持つ行にブレークポイントを置くことはできませんが、初期化は行いません。 – Stilgar