1

以下のコードスニペットを参照してください

class scopes
{
  static int j=20;
  Console.WriteLine(j);
    public static void Main()
   {
       int j=30;
       Console.WriteLine(j);
       return;
   }
}

上記のコードでは、変数の非表示がサポートされてい
ます。以下のコードを参照してください

public static int Main()
{
    int j = 20;
    for (int i=0; i < 10; i++)
    {
        int j = 30;    //can't do this
        Console.WriteLine(j + i);
    }
    return 0;
}

上記のコードでは、変数の非表示はサポートされていません。

この背後にある理由は何ですか?

4

1 に答える 1

4

最初のケースでは、少なくとも2つのことを明確にするための定義された方法があります。つまり、this.メソッド内のプレフィックスthis.jはフィールドであり、jはメンバーです。これがサポートされている理由については、推測ですが、おそらくクラスにフィールドを追加しても(クラスの場合は別のコードファイルにある可能性がありpartialます)、ランダムなメソッドがコンパイラエラーをスローし始めないようにするためです。メソッド内のの意味は、フィールドが追加さjれる前後で同じであることに注意してください。j

2番目のケースでは、これは問題ではありません。ローカルを追加すると、単一のローカルメソッドにのみ影響があり、曖昧性解消構文(つまり、意味)がなく、無関係なコードjによる偶発的な破損のリスクもありません。

于 2012-11-15T14:12:30.090 に答える