8

C#では、次のようなことをした場合:

int x;

次にF10を押すと、xにゼロが格納されていることがわかります。

しかし、xを使おうとすると、初期化する必要があると表示されます。なぜですか。そこにはゼロがあるはずですよね?

同じことが配列にも当てはまります。したがって、次のようになります。

int[]a = new int[5];

それをF10すると、そこにあるすべてのintがゼロであることがわかります。

どうしたの ?また、C ++とは異なり、C#で変数を初期化する必要があるのはなぜですか?

4

5 に答える 5

7

これは、初期化されていない変数によるコードのバグを減らすのに役立つコンパイル時エラーです。非常に便利。

http://msdn.microsoft.com/en-us/library/4y7h161d(VS.80).aspx

もっと読む:

http://blogs.msdn.com/b/abhinaba/archive/2005/11/08/490248.aspx

エラーを無効にすることについてのいくつかの言葉(あなたはただあなたに警告することはできません-それは警告ではありません):

http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/a073ccea-c43b-4536-be76-41949f0e2135

http://blogs.msdn.com/b/ericlippert/archive/2009/10/12/absence-of-evidence-is-not-evidence-of-absence.aspx (この件に関して最も有益であることが証明されています)

さらに、「localsinit」ILフラグ(ローカルにデフォルト値を設定するように強制する)と「二重代入」(C#では既に存在する場合でも強制的に書き込む)との関係についてさらに説明します。int v=0さらに深く読みたい場合は、ECMA-335のセクションI.12.2で定義されている「localsinit」をここで入手できます

于 2012-07-13T00:34:53.590 に答える
4

簡単に言えば、それがC#の仕組みだからです。C#言語仕様から:

5.3.2最初に割り当てられていない変数

次のカテゴリの変数は、最初は未割り当てとして分類されます。

・最初に割り当てられていない構造体変数のインスタンス変数。

・structインスタンスコンストラクターのthis変数を含む出力パラメーター。

・catch句またはforeachステートメントで宣言されているものを除くローカル変数。

一方で:

5.3.1最初に割り当てられた変数

次のカテゴリの変数は、最初に割り当てられたものとして分類されます。

・静的変数。

・クラスインスタンスのインスタンス変数。

・最初に割り当てられた構造体変数のインスタンス変数。

・配列要素。

・値パラメータ。

・参照パラメータ。

・catch句またはforeachステートメントで宣言された変数。

于 2012-07-13T00:37:27.863 に答える
3

単純です...コンパイラは、ローカル変数を使用する前に初期化するように要求するためです。これにより、初期化の失敗に関連するすべてのカテゴリのミスを防ぐことができます。

次のいくつかのステートメントから生成されたILを見ると:

int x;
Console.WriteLine("hello");
int y=5;
x=6;
Console.WriteLine(x+y);

次のように表示されます。

//notice no ops related to x prior to console.writeline
IL_0000:  ldstr       "hello"
IL_0005:  call        System.Console.WriteLine
IL_000A:  ldc.i4.5    
IL_000B:  stloc.1        //create/store y
IL_000C:  ldc.i4.6    
IL_000D:  stloc.0        //x is really only created right here
IL_000E:  ldloc.0     
IL_000F:  ldloc.1     
IL_0010:  add         
IL_0011:  call        System.Console.WriteLine

ILに格納する前にxの値が表示されている場合、それはデバッガーのトリックです。

于 2012-07-13T00:34:52.013 に答える
2

自動初期化は、言語を保証するものではなく、実行時のセキュリティ機能であると私は信じています。.NETが変数をゼロにすることは起こりますが、それはすべてのフレームワークに当てはまる必要はありません。

アレイの場合、それ保証されていることに注意してください。

于 2012-07-13T00:36:26.537 に答える
1

0であるのは運がいいだけで、何でもかまいません。そのため、初期化する必要があります。

于 2012-07-13T00:34:03.437 に答える