हां, यह काम करेगा जैसा आप चाहते हैं।
तुलना संदर्भ से नहीं है, यह मूल्य के आधार पर है, जिसका अर्थ है कि आप एक अलग प्रतिनिधि को सदस्यता छोड़ सकते हैं, जब तक कि यह एक ही वस्तु पर एक ही विधि को इंगित करता है।
दूसरे शब्दों में, यह ठीक से काम करेगा:
var delegate1 = new ExternalObjectClickEventHandler(MethodA);
var delegate2 = new ExternalObjectClickEventHandler(MethodA);
ExternalObject.Click += delegate1;
ExternalObject.Click -= delegate2;
बेनामी तरीकों अलग हालांकि कर रहे हैं, यदि आप ऐसा नहीं कर सकते हैं:
public MethodB()
{
ExternalObject.Click +=() => { return 10; };
}
public MethodC()
{
ExternalObject.Click -=() => { return 10; };
}
जबकि तरीकों एक ही कोड होते हैं, वे विचार कर रहे हैं अलग, और इस प्रकार यह काम नहीं करेगा, यानी MethodC
आपके द्वारा MethodB
में जोड़े गए प्रतिनिधि की सदस्यता समाप्त नहीं करेगा।
इस समस्या को हल करने के लिए, अगर आप इस तरह, आमंत्रण के बीच प्रतिनिधि स्टोर करने के लिए है:
private ExternalObjectClickEventHandler _ClickEventHandler;
public MethodB()
{
_ClickEventHandler =() => { return 10; };
ExternalObject.Click += _ClickEventHandler;
}
public MethodC()
{
ExternalObject.Click -= _ClickEventHandler;
}
लेकिन कोड आप से पता चला है, काम करेंगे।
अपने प्रश्न पर्दे के पीछे क्या होता है का सवाल है, कि कोड की निम्न दो पंक्तियों समान हैं है जब यह उत्पन्न कोड की बात आती है:
है
ExternalObject.Click += MethodA;
ExternalObject.Click += new ExternalObjectClickEventHandler(MethodA);
दूसरा कोड क्या पहले से उत्पन्न होता है (यह मानते हुए घटना का प्रकार दिखाया गया है।)
पहला वाक्यविन्यास (कुछ बिंदु पर) "सिंटैक्टिक चीनी" के रूप में जोड़ा गया था जिसे संकलक द्वारा अनुवादित किया गया है जैसे कि आपने दूसरा वाक्यविन्यास लिखा था। ध्यान दें कि यह तभी होता है जब संकलित सही प्रकार का 100% पता लगा सके। मैंने कुछ मामलों को देखा है (जिन्हें मैं अभी याद नहीं कर सकता) जहां आपको पूरी तरह से योग्य वाक्यविन्यास का उपयोग करना पड़ा क्योंकि संकलक यह समझ नहीं पाया कि आपका क्या मतलब है। विशेष रूप से, विधि अधिभार और जेनेरिक इस संबंध में इसे भ्रमित कर सकते हैं।
एक पूर्ण जवाब के लिए धन्यवाद। – kubal5003