デフォルトが0のときにC#でintに値を割り当てる必要があるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1423437

質問

これは動作します:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

ただし、これによりコンパイラエラーが発生します("未割り当てのローカル変数 'a'"を使用):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

最初の例では、技術的にはコンパイラが 'a'が割り当てられていないことを知らないため、これが起こると言えます。後者の例では、「a」はローカルで定義されているため、簡単に追跡できます。

しかし、後者の例が機能しないのはなぜですか?

整数はデフォルトで0になりませんか?これは、コンパイラが「ベストプラクティス」のために強制するものですか。または、別の理由がありますか?

役に立ちましたか?

解決

最初の例では、フィールドです。フィールドはデフォルトで自動的に0 / false / nullになります。 2番目の例では、変数です。変数はデフォルトでは されておらず、「明確な割り当て」が必要です。使用される前。

本質的に、オブジェクトを作成する(または構造体を初期化する)とき、メモリをゼロにします(または、デフォルト以外の構造体の場合、すべてを手動で初期化する必要があります)。ただし、変数は(すべてのメソッドで)非常に一般的であるため、常にスタックをゼロにしなければならないというオーバーヘッドは望ましくありません。代わりに、初期値を強制的に指定します。

他のヒント

  

整数はデフォルトで0になりませんか?

クラスのデータメンバーの場合は実行しますが、ローカル変数の場合は実行しません。ローカル変数は、使用する前に明示的に初期化する必要があるため、コンパイラエラーです。

クラスの新しいインスタンスをインスタンス化すると、オブジェクトが必要とするすべてのメモリが「ゼロ化」されます。 intは0に設定されます。文字列はnullなどに設定されます。これは、C(++)で可能だった多くの奇妙なメモリバグとハッキングを回避するためです。残念ながら、これは処理コストも小さいため、ローカル変数を作成するとき、言語はすぐに自分で値を設定し、必要な命令の総数を減らすために値をゼロに設定しないと想定しています。未設定メモリを使用するリスクを相殺するために、変数を使用できるようになる前に値が設定されていることを確認するコンパイラチェックが導入されます。

クラスレベルで宣言された変数に同じスコープの値を割り当てることはできないためです(宣言時以外)

e.g

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

whereas

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

クラスで変数を宣言してオブジェクトを作成したときの私の知識では、デフォルトのコンストラクターは変数を初期化するため、クラス変数を初期化する必要はありません。しかし、クラスのメソッドに来ると、コンストラクターやそれらの変数を初期化するものは何もないので、メソッドに初期化されていない変数を割り当てることはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top