2012-04-05 7 views
5

と仮定C#のイベント:どのように変数は<code>ChangeViewEvent</code>が発射されたときに、イベントハンドラは、まだ変数<code>i</code>にアクセスすることができますどのように来る

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Program p = new Program(); 
     A a = new A(); 
     p.Do(a); 
     System.Threading.Thread.Sleep(1000); 
     a.Fire(); 
    } 

    public void Do(A a) 
    { 
     int i = 5; 
     a.ChangeViewEvent +=() => 
     { 
      Console.WriteLine(i); 
     }; 
    } 
} 

public class A 
{ 
    public delegate void ChangeView(); 
    public event ChangeView ChangeViewEvent; 

    public void Fire() 
    { 
     if(ChangeViewEvent != null) 
      ChangeViewEvent(); 
    } 
} 

にアクセスしていますか?私はそれが範囲外であるべきではないと思いますか?

+0

非常に良い質問、確かに! :) – Dhananjay

答えて

6

ChangeViewEventが発生すると、イベントハンドラは引き続き変数iにアクセスできますか?私はそれが範囲外であるべきではないと思いますか?

いいえ、それはラムダ式によって取得されます。コンパイラが生成したクラスに "持ち上げ"られ、 "範囲外"のときでもラムダ式にアクセスできるようになります。 (「範囲外」という意味は「単純な名前でアクセスできない」という意味であることを覚えておいてください。それは、その変数に関連付けられている記憶領域がなくなったことを意味するものではありません。)

ところで、これはです。理由の中には、なぜ「値の種類がスタックに存在する」という誤った繰り返しの偽りがあるのですか?この場合、実際にコンパイラ生成クラスに持ち込まれ、ヒープ上に生き残る値型があります。

このトピックの詳細については、MSDNを参照してください。

+0

すばらしい答え! – Dhananjay

関連する問題