2012-03-20 10 views
2
public class SelfCallingTest 
{ 
    private static int counter; 

    public void SelfCallingMethod(int counter) 
    { 
     Console.WriteLine("The input integer is: {0} ", counter); 

     counter++; 

     while (counter <= 2) 
     { 
      SelfCallingMethod(counter); 
     } 
    } 
} 

上記SelfCallingTestクラスは、静的フィールド名「カウンタ」を有するとSelfCallingMethodは「カウンタ名前整数パラメータを受け取る台無しにされる理由"(同じ名前のような静的インスタンス部材カウンタ) SelfCallingMethodは現在コンソールテストアプリケーションのmain()メソッド方法スコープパラメータ値が同じ名前のインスタンス・レベルの静的フィールドは、クラス内で宣言された場合

static void Main(string[] args) 
    {   
     SelfCallingTest sct = new SelfCallingTest(); 
     sct.SelfCallingMethod(0); 

     Console.Read(); 
    } 

から呼び出されている問題は、ループが無限ループに起こっている間ということであるので、カウンタ方式レベル変数の値value = 3に達すると、スレッドコントロールがメソッドから抜け出し、再び再開しますループの実行中にメソッドレベルカウンタ変数が2に設定されている - このカウンタが2に設定されている理由がわかりません。

メソッドパラメータ名カウンタを静的インスタンスフィールド名以外に変更すると、コンソールが0,1,2を印刷しています

私に説明を教えてください。 .NET CLRにTLS(スレッドローカルストレージ?)から値を読み取るバグはありますか?

ループ条件が常に2を評価している間に、メソッドSelfCallingMethodの呼び出しスタックを開始するために、 = 2と無限ループを引き起こすもの。

+0

おそらく、再帰呼び出しで 'while'の代わりに' if'を使用したとしますか? –

答えて

7

コードはであり、静的フィールドは決して使用していません。このループを見てください:

while (counter <= 2) 
{ 
    SelfCallingMethod(counter); 
} 

counterローカル変数(パラメータ)です。 の値がからSelfCallingMethodに渡されているため、メソッド呼び出しによって変更されることはありません。例外を除いて、ループを終了する方法はどう思いますか?

SelfCallingMethod(0)でスタックを取得し、SelfCallingMethod(1)(増分後)を呼び出すと、SelfCallingMethod(3)を呼び出すSelfCallingMethod(2)が呼び出されます。それはカウンターのコピーをインクリメントして(4に)戻りますが、SelfCallingMethod(2)からのループはちょうど回ってSelfCallingMethod(3)に再度コールします。 SelfCallingMethodのそれぞれのコールには、がそれぞれcounterという変数があることを忘れないでください。

できるだけ早く私は、静的インスタンスのフィールド名以外にメソッドパラメータ名カウンタを変更すると、結果が予想され、コンソールが原因で、その時点ですべて、0、1、2

はい印刷されていますこのメソッドでcounterを使用するコードは、ローカル変数の代わりにフィールドを使用します。名前が同じ場合、ローカル変数は、静的変数を隠します。 (あなたはまだかかわらず、明示的にアクセスするためにSelfCallingTest.counterを使用することができます。)

TLSから値を読み込むための.NET CLRのバグ(スレッドローカルストレージ?)

絶対にありませんあります。唯一のバグはあなたのコードにあります、私は恐れています。

+0

ループ条件が常に2 == 2と無限ループを引き起こしている間に、SelfCallingMethodメソッドの呼び出しスタックのために、ここに問題があります。 – user1281530

1

パラメタカウンタはスコープ内で最も近く、実際には静的変数はコードから参照されません。あなたがテストしているカウンタをインクリメントするものは何もありません。

+0

ループ条件が常に2 == 2と無限ループを引き起こしている間に、SelfCallingMethodメソッドの呼び出しスタックのために、ここに問題があります。 – user1281530