2011-11-15 14 views
6

मैं अगर मैं कुछ इस तरह कर सोच रहा हूँ:सी # घटनाओं और वर्ग तरीकों

class A 
{ 
    public MethodA() 
    { 
    } 
    public MethodB() 
    { 
     ExternalObject.Click += this.MethodA; 
    } 
    public MethodC() 
    { 
     ExternalObject.Click -= this.MethodA; 
    } 
} 

A a = new A(); 
a.MethodB(); 
a.MethodC(); 

यह काम करने के लिए जा रहा है? "काम" से मेरा मतलब है - क्या विधिए को ExternalObject से सदस्यता समाप्त कर दिया जाएगा। घटना पर क्लिक करें?

और अन्य संबंधित प्रश्नों:

जब एक उदाहरण विधि प्रतिनिधि उदाहरण के बजाय प्रयोग किया जाता है क्या पर्दे के पीछे क्या होता है? (ऊपर की तरह)

क्या इससे एक प्रतिनिधि का अंतर्निहित निर्माण होता है?

-= ऑपरेटर प्रतिनिधियों के बीच तुलना करता है - संदर्भ द्वारा या शायद कुछ और परिष्कृत होता है?

उत्तर

8

हां, यह काम करेगा जैसा आप चाहते हैं।

तुलना संदर्भ से नहीं है, यह मूल्य के आधार पर है, जिसका अर्थ है कि आप एक अलग प्रतिनिधि को सदस्यता छोड़ सकते हैं, जब तक कि यह एक ही वस्तु पर एक ही विधि को इंगित करता है।

दूसरे शब्दों में, यह ठीक से काम करेगा:

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% पता लगा सके। मैंने कुछ मामलों को देखा है (जिन्हें मैं अभी याद नहीं कर सकता) जहां आपको पूरी तरह से योग्य वाक्यविन्यास का उपयोग करना पड़ा क्योंकि संकलक यह समझ नहीं पाया कि आपका क्या मतलब है। विशेष रूप से, विधि अधिभार और जेनेरिक इस संबंध में इसे भ्रमित कर सकते हैं।

+0

एक पूर्ण जवाब के लिए धन्यवाद। – kubal5003

3

हां, MethodA सदस्यता समाप्त कर दी जाएगी।

दूसरे प्रश्न के बारे में मैं 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि = this.MethodA पृष्ठभूमि में एक प्रतिनिधि को परिवर्तित करता है।

+0

+1। 'यह। MethodA' को एक प्रतिनिधि को स्पष्ट रूप से परिवर्तित कर दिया जाएगा। – kol

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