2012-03-08 9 views
6

投稿からthis投稿すると、次のコードセクションでは「ループ変数を閉じるという大変な行為」がありました。ループ変数をC#

foreach (Canidate canidate in allCanidates) 
    { 
     Thread newThread = new Thread(delegate() 
     { 
      BusyWait(canidate); 
     }); 

     newThread.Start(); 
    } 

私はこれにそれを切り替える:

foreach (Canidate canidate in allCanidates) 
     { 
      var can = canidate; 
      Thread newThread = new Thread(delegate() 
      {     
       BusyWait(can); 
      }); 

      newThread.Start(); 
     } 

しかし、私の上司は、それが同じ問題に苦しむだろうと主張し続けています。私はこの問題を解決するためにthisリンクを使用しました。誰かが私のコードが正しく実行されるように問題を正しく解決するのを助けることができますか?この問題は私にとって初めてのことです。私はそれを完全に理解しているかどうかはわかりません。

+17

あなたの上司は間違っています。 –

+16

そして先が尖っています。 –

+0

それは誰でも説明できますか?私はそれを完全に理解していないかわかりません。正確には2人の違いは、私にとってはまったく同じことをしているようです。しかし、私はそれを実行するとき、私は彼らがないことを知っている。 – user489041

答えて

4

後で値を変更する変数をクローズすると、問題が発生します。

  • candidateは、ループの周りのすべての「ラップ」に変更し、問題が発生します。
  • canは、ループの周りの "周回"ごとに新しく作成され、変更されることはありません。は、に問題がありません。
+0

これは、スレッドが実際に実行されたときに、候補が現在の値の候補である可能性があります。スレッドは開始する前にループが終了する可能性が高いため、通常は候補リストの最後の項目ですか? – user489041

+0

@ user489041正確には、ラップされたときの値ではなく、現在の値が取得されます。変化しない変数は、(定義によって)その値を保持し、問題を引き起こさないので、ループ内に新しい変数を作成すると状況が解決し、範囲外になり、変更されずに再作成されます。 –