c# सी # में लैम्ब्डा द्वारा बनाए गए प्रतिनिधि का जीवनकाल क्या है?





2 Answers

यह किसी भी तरह से गारंटी नहीं है।

वर्तमान एमएस कार्यान्वयन के बारे में मुझे क्या याद है:

  • एक लैम्ब्डा अभिव्यक्ति जो किसी भी चर को कैप्चर नहीं करती है वह स्थिर रूप से कैश की जाती है
  • एक लैम्ब्डा अभिव्यक्ति जो केवल "इस" को कैप्चर करती है, प्रति-उदाहरण के आधार पर कैप्चर की जा सकती है, लेकिन नहीं
  • एक लैम्ब्डा अभिव्यक्ति जो स्थानीय चर को कैप्चर करती है उसे कैश नहीं किया जा सकता है
  • दो लैम्ब्डा अभिव्यक्तियां जिनमें सटीक एक ही प्रोग्राम टेक्स्ट है, को अलियाड नहीं किया जाता है ; कुछ मामलों में वे हो सकते हैं, लेकिन उन परिस्थितियों को काम करना जिनमें वे हो सकते हैं, वे बहुत जटिल होंगे
  • संपादित करें: टिप्पणियों में एरिक बताते हैं, आपको सामान्य तरीकों के लिए कैप्चर किए जाने वाले प्रकार के तर्कों पर भी विचार करना होगा।

संपादित करें: सी # 4 spec का प्रासंगिक पाठ खंड 6.5.1 में है:

समान प्रतिनिधि प्रकार को वापस करने के लिए उसी प्रतिनिधि प्रकार के कैप्चर किए गए बाहरी परिवर्तनीय उदाहरणों के समान (संभावित रूप से खाली) सेट के साथ अर्थात् समान अनाम कार्यों के रूपांतरण की अनुमति है (लेकिन आवश्यक नहीं)। अर्थात् समान रूप से समान शब्द का अर्थ यह है कि अज्ञात कार्यों का निष्पादन, सभी मामलों में, समान तर्कों के समान प्रभाव उत्पन्न करेगा।

c# delegates lambda

Lambdas अच्छा हैं, क्योंकि वे brevity और इलाके और encapsulation का एक अतिरिक्त रूप प्रदान करते हैं । एक बार जब आप लैम्ब्डा का उपयोग कर सकते हैं तो केवल उन कार्यों को लिखने के बजाय उपयोग किया जाता है।

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

यह कार्यान्वयन काम करता है, हालांकि शायद अधिक मात्रा में (अभी भी इसका शोध कर रहा है), मेरी धारणा को सही साबित करना साबित करता है।

एक छोटा सा उदाहरण:

class SomeClass
{
    public void Bleh()
    {
        Action action = () => {};
    }

    public void CallBleh()
    {
        Bleh();  // `action` == {Method = {Void <SomeClass>b__0()}}
        Bleh();  // `action` still == {Method = {Void <SomeClass>b__0()}}
    }
}

क्या लैम्ब्डा कभी एक नया उदाहरण लौटाएगा, या क्या यह हमेशा एक जैसा होने की गारंटी है?




मुझे लगता है कि जब मैं जवाब दे रहा था, तब स्कीट कूद गया, इसलिए मैं उस बिंदु को कम नहीं करूँगा। एक चीज जो मैं सुझाऊंगा, बेहतर तरीके से समझने के लिए कि आप चीजों का उपयोग कैसे कर रहे हैं, रिवर्स इंजीनियरिंग टूल्स और आईएल से परिचित होना है। सवाल में कोड नमूना लें और आईएल को रिवर्स इंजीनियर लें। कोड आपको काम करने के तरीके के बारे में बड़ी जानकारी देगा।




Related