2012-04-05 13 views
5

मान लीजिए एक्सेस किया जाता हैसी # घटनाओं: कैसे चर

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(); 
    } 
} 

कैसे आते हैं जब ChangeViewEvent सक्रिय होने पर, ईवेंट हैंडलर अभी भी चर i उपयोग करने में सक्षम है? मेरा मतलब है कि यह गुंजाइश या कुछ से बाहर नहीं होना चाहिए?

+0

बहुत अच्छा सवाल है, वास्तव में! :) – Dhananjay

उत्तर

6

जब चेंजव्यूवेंट निकाल दिया जाता है, तो ईवेंट हैंडलर अभी भी चर का उपयोग करने में सक्षम है? मेरा मतलब है कि यह गुंजाइश या कुछ से बाहर नहीं होना चाहिए?

नहीं, यह लैम्ब्डा अभिव्यक्ति द्वारा कब्जा कर लिया गया है। यह एक कंपाइलर से उत्पन्न वर्ग में "उठाया" हो जाता है ताकि यह लैम्ब्डा अभिव्यक्ति के लिए अभी भी पहुंच योग्य हो, भले ही यह "दायरे से बाहर हो।" (याद रखें, "दायरे से बाहर" का अर्थ केवल "इसके सरल नाम से सुलभ नहीं है।" इसका मतलब यह नहीं है कि उस चर के साथ जुड़े भंडारण स्थान किसी और के द्वारा सुलभ नहीं है।)

वैसे, यह एक कई लोगों के बीच कारण है कि बार-बार झूठ बोलने का झूठ "मूल्य प्रकार स्टैक पर रहते हैं" झूठा है। इस मामले में, आपके पास एक वैल्यू टाइप है जो वास्तव में एक कंपाइलर-जेनरेटेड क्लास में फंस जाता है और ढेर पर रहता है।

इस विषय पर अधिक जानकारी के लिए, MSDN देखें।

+0

उत्कृष्ट उत्तर! – Dhananjay

संबंधित मुद्दे