2010-07-28 14 views
13
public void Bar() 
{ 
    Foo foo = new Foo(); 
    **foo.MyEvent += foo_MyEvent;** 
    foo.FireEvent();   
} 

void foo_MyEvent(object sender, EventArgs e) 
{ 
    ((Foo)sender).MyEvent -= foo_MyEvent; 
} 

अरे, मैं घटनाओं से थोड़ा अपरिचित हूं, क्या कोई मुझे बता सकता है कि + = ऑपरेटर घटनाओं के साथ क्या करता है?+ = घटनाक्रम के साथ ऑपरेटर

उत्तर

31

+= किसी ईवेंट की सदस्यता लेता है। += के दाईं ओर दिए गए प्रतिनिधि या विधि को एक आंतरिक सूची में जोड़ा जाएगा जो ईवेंट ट्रैक रखता है, और जब मालिक वर्ग उस घटना को सक्रिय करता है, तो सूची में सभी प्रतिनिधियों को बुलाया जाएगा।

+15

और '- =' सदस्यता रद्द – CaffGeek

0

यह किसी ईवेंट में हैंडलर जोड़ता है। इसका मतलब यह है कि ऑपरेशन के दाहिने तरफ की विधि लागू की जाएगी जब घटना बढ़ेगी।

1

इस मामले विधि foo_MyEvent को सक्रिय कर देगा whene कि घटना कहा जाता है में

17

जवाब आप स्वीकार कर लिया है += क्या करता है का एक अच्छा सरलीकृत संस्करण है (ताकि आप लाइन 4 में घटना की सदस्यता), लेकिन यह नहीं है पूरी कहानी।

+= ऑपरेटर ईवेंट पर ऐड विधि कहता है। इसी तरह -= कॉल हटाएं। यह आमतौर पर परिणामस्वरूप प्रतिनिधि को हैंडलरों की आंतरिक सूची में जोड़ा जा रहा है, जिन्हें ईवेंट निकाल दिया जाता है, लेकिन हमेशा नहीं होता है।

कुछ और करने के लिए जोड़ने को परिभाषित करना पूरी तरह से संभव है। इस उदाहरण प्रदर्शित करने के लिए क्या होता है में मदद मिल सकती है जब आप += फोन:

class Test 
{ 
    public event EventHandler MyEvent 
    { 
     add 
     { 
      Console.WriteLine("add operation"); 
     } 

     remove 
     { 
      Console.WriteLine("remove operation"); 
     } 
    }  

    static void Main() 
    { 
     Test t = new Test(); 

     t.MyEvent += new EventHandler (t.DoNothing); 
     t.MyEvent -= null; 
    } 

    void DoNothing (object sender, EventArgs e) 
    { 
    } 
} 

आउटपुट: अधिक जानकारी के लिए events and delegates पर

 
add operation 
remove operation 

देखें जॉन स्कीट के लेख।

+1

यह सटीक है। मेरा जवाब ढांचे वर्गों पर आपको मिलने वाली सभी घटनाओं के व्यवहार को प्रतिबिंबित करना चाहिए, लेकिन यदि आप किसी और की घटना की सदस्यता लेते हैं तो ऐसा नहीं हो सकता है। – mquander

1

इवेंट सिर्फ प्रतिनिधियों की अपरिवर्तनीय सूची है (यानी सब्सक्राइब करता है जो उस घटना को प्रकाशित/आमंत्रित करते समय कॉल किया जाएगा)। आप तर्क दे सकते हैं कि हम इसके बजाय सूची का उपयोग कर सकते थे। अगर हम इस तरह से गए, तो कोई हमारे ग्राहकों के साथ बदनाम हो सकता था।

उपरोक्त परिदृश्य जहां सूची का उपयोग में, आप कर सकता है:

lstDelegate = newDelegate

और आप मौजूदा ग्राहकों के मिटा दिया है (lstDelegate केवल अब उर प्रतिनिधि कॉलबैक शामिल हैं)।

उस बीहाइवर को रोकने के लिए हमारे पास इवेंट है। जब आप ईवेंट का उपयोग करते हैं, तो शिकायतकर्ता आपको ऐसा करने की अनुमति नहीं देता है, आपको केवल + = और - = का उपयोग करके अपने स्वयं के प्रतिनिधि को जोड़ने/निकालने की अनुमति है। इस तरह मैं इसे किसी भी तरह से अलग करने की कोशिश करता हूं। आशा करता हूँ की ये काम करेगा।

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