2012-10-19 11 views
5

"कैप्चर किए गए चर" में एक चर कैप्चर किया जाता है?कैप्चर किए गए चर ... वास्तव में 'कैप्चर' क्या है?

वास्तव में 'कैप्चर' शब्द क्या है?

क्या इसका मतलब बॉक्सिंग को शामिल किए बिना मूल्य प्रकार का संदर्भ देना है?

धन्यवाद

उत्तर

7

कब्जा कर लिया चर आम तौर पर एक चर एक बंद (मूल रूप से एक इनलाइन समारोह) के साथ कब्जा कर लिया जाता है। "कैप्चर" का अर्थ है कि इनलाइन फ़ंक्शन को बाहरी फ़ंक्शन में एक चर के संदर्भ को "कैप्चर" करना चाहिए। ऐसा करने के लिए, सी # कंपाइलर एक आंतरिक वर्ग उत्पन्न करता है और आंतरिक चर (जिसे इनलाइन फ़ंक्शन बाद में संदर्भ) में संदर्भ द्वारा बाहरी चर को पास करता है। यदि आप अपना कोड डिस्सेबल करते हैं तो आप इसे देख सकते हैं।

पर विचार करें

void Main() 
{ 
    string s = "hello"; 
    Action a = delegate 
    { 
      Debug.WriteLine(s); 
    }; 
    s = "hello2"; 
    a(); 
} 

ऊपर के उदाहरण में निम्नलिखित, स्ट्रिंग चर रों इनलाइन कार्रवाई एक द्वारा कब्जा कर लिया गया है।

हुड के तहत, सी # कंपाइलर एक आंतरिक वर्ग बनाएगा, जो चर के चर को कैप्चर करने के लिए एक संदर्भ क्रिया करता है। यह ध्यान रखना महत्वपूर्ण है कि स्ट्रिंग एस को एक्शन ए के संदर्भ में पारित किया गया है, इसलिए कार्रवाई वास्तव में "हैलो 2" प्रिंट नहीं करेगी, न कि "हैलो"। यदि स्पष्ट रूप से समझ में नहीं आता है, तो यह अनपेक्षित दुष्प्रभाव उत्पन्न कर सकता है, और इसे "संशोधित बंद करने तक पहुंच" कहा जाता है।

+0

यह मूल्य भी देख रहा है: http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – pencilCake

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