जब मैं C # संकलक (4.0 यदि वह मायने रखता है) की ओर से कुछ अत्यंत जिज्ञासु कोड-जीन में भाग लेने पर (जीवन को) वैधता से बंद करने की संभावना के बारे में एक प्रश्न का उत्तर दे रहा था ।
सबसे छोटा रिप्रो जो मैं पा सकता हूं वह निम्नलिखित है:
- एक लैम्ब्डा बनाएं जो एक स्थानीय को कैप्चर करता है जिसमें युक्त प्रकार का एक स्थिर तरीका है।
- किसी ऑब्जेक्ट के इंस्टेंस फ़ील्ड में जनरेट किया गया प्रतिनिधि-संदर्भ असाइन करें ।
परिणाम: कंपाइलर एक क्लोजर-ऑब्जेक्ट बनाता है जो उस ऑब्जेक्ट को संदर्भित करता है जो लैम्बडा का निर्माण करता है, जब इसका कोई कारण नहीं होता है - प्रतिनिधि का 'इनर' टार्गेट एक स्टैटिक तरीका है, और लैम्ब्डा-क्रिएटिंग-ऑब्जेक्ट का इंस्टेंस सदस्यों को जरूरत नहीं है जब प्रतिनिधि को निष्पादित किया जाता है, तो उसे (और नहीं) छुआ जाता है। प्रभावी रूप से, संकलक कार्य कर रहा है जैसे प्रोग्रामर ने this
बिना कारण के कब्जा कर लिया है।
class Foo
{
private Action _field;
public void InstanceMethod()
{
var capturedVariable = Math.Pow(42, 1);
_field = () => StaticMethod(capturedVariable);
}
private static void StaticMethod(double arg) { }
}
रिलीज़ बिल्ड से उत्पन्न कोड ('सरल' C # से विघटित) इस तरह दिखता है:
public void InstanceMethod()
{
<>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1();
CS$<>8__locals2.<>4__this = this; // What's this doing here?
CS$<>8__locals2.capturedVariable = Math.Pow(42.0, 1.0);
this._field = new Action(CS$<>8__locals2.<InstanceMethod>b__0);
}
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
// Fields
public Foo <>4__this; // Never read, only written to.
public double capturedVariable;
// Methods
public void <InstanceMethod>b__0()
{
Foo.StaticMethod(this.capturedVariable);
}
}
इस बात का निरीक्षण करें कि <>4__this
क्लोजर ऑब्जेक्ट का फील्ड ऑब्जेक्ट रेफरेंस से पॉपुलेटेड है, लेकिन कभी भी (कोई कारण नहीं है) से पढ़ा जाता है।
तो यहां क्या हो रहा है? क्या भाषा-विनिर्देश इसके लिए अनुमति देते हैं? क्या यह संकलक बग / विषमता है या वस्तु को संदर्भित करने के लिए बंद करने के लिए एक अच्छा कारण है (कि मैं स्पष्ट रूप से गायब हूं)? यह मुझे चिंतित करता है क्योंकि यह करीबी-खुश प्रोग्रामर (मेरे जैसे) के लिए एक नुस्खा जैसा लगता है कि अनजाने में स्मृति-लीक (यदि प्रतिनिधि को एक इवेंट-हैंडलर के रूप में इस्तेमाल किया गया था) कल्पना करें।
this
।