2011-02-10 21 views
11

आमतौर पर हम इस कोड का उपयोग करते हैं:एक घटना लिखने का संक्षिप्त तरीका?

 private EventHandler _updateErrorIcons; 
    public event EventHandler UpdateErrorIcons 
    { 
     add { _updateErrorIcons += value; } 
     remove { _updateErrorIcons -= value; } 
    } 

क्या स्वचालित गुणों के समान एक समान शॉर्टकट है? कुछ ऐसा है:

 public event EventHandler UpdateErrorIcons { add; remove; } 
+0

जो वास्तव में मजेदार है, अधिकांश लोगों ने कभी भी विस्तारित कोड के बारे में कभी नहीं सुना है :) – Andrey

+0

हाँ, भले ही मैंने लोगों को यह देखा है, मैंने व्यक्तिगत रूप से इसका उपयोग कभी नहीं किया, संकलक इसे बाद में जोड़ता है। –

उत्तर

14

हाँ। { add; remove; } हिस्सा है और समर्थन प्रतिनिधि क्षेत्र से छुटकारा और आप सुनहरा कर रहे हैं:

public event EventHandler UpdateErrorIcons; 

यह है कि!

मुझे यह प्रश्न पूछने से पहले बस इसे जोड़ने दें, मैंने इस तथ्य के बारे में भी सोचा नहीं था कि घटनाओं का स्वत: कार्यान्वित संस्करण गुणों के साथ असंगत है। व्यक्तिगत रूप से, मैं वास्तव में पसंद करूंगा यदि ऑटो-कार्यान्वित घटनाओं ने आपके प्रश्न में पहली बार प्रयास किया था। यह अधिक सुसंगत होगा, और यह मानसिक अनुस्मारक के रूप में भी कार्य करेगा कि घटनाएं प्रतिनिधि फ़ील्ड के समान नहीं हैं, जैसे गुण नियमित फ़ील्ड के समान नहीं हैं।

ईमानदारी से, मुझे लगता है कि आप दुर्लभ अपवाद हैं जहां आप वास्तव में कस्टम वाक्यविन्यास पहले के बारे में जानते थे। बहुत से .NET डेवलपर्स के पास कोई संकेत नहीं है कि आपके add और remove विधियों को लागू करने का विकल्प है।


अद्यतन: बस मन की अपनी खुद की शांति के लिए, मैं Reflector का उपयोग कर पुष्टि की है कि सी # 4 में ईवेंट की डिफ़ॉल्ट कार्यान्वयन (यानी, कार्यान्वयन उत्पन्न हो जाता है कि जब आप स्वत: लागू किया जाना मार्ग) इस के बराबर है:

private EventHandler _updateErrorIcons; 
public event EventHandler UpdateErrorIcons 
{ 
    add 
    { 
     EventHandler current, original; 
     do 
     { 
      original = _updateErrorIcons; 
      EventHandler updated = (EventHandler)Delegate.Combine(original, value); 
      current = Interlocked.CompareExchange(ref _updateErrorIcons, updated, original); 
     } 
     while (current != original); 
    } 
    remove 
    { 
     // Same deal, only with Delegate.Remove instead of Delegate.Combine. 
    } 
} 

ध्यान दें कि ऊपर ताला मुक्त तुल्यकालन को प्रभावी ढंग से add और remove कॉल क्रमानुसार करने का इस्तेमाल करता है। तो यदि आप नवीनतम सी # कंपाइलर का उपयोग कर रहे हैं, तो आपको add/remove सिंक्रनाइज़ेशन के लिए भी लागू करने की आवश्यकता नहीं है।

+3

और बैकिंग फ़ील्ड। (वास्तव में, ओपी, आप पाएंगे कि बहुत से लोग 'एड' और 'निकालें' ईवेंट एक्सेसर्स के बारे में भी अवगत नहीं हैं।) –

+0

हम सिंक्रनाइज़ेशन के लिए कुछ ईवेंट में जोड़ और निकालने का उपयोग कर रहे हैं। – Carra

+0

@ कररा: आप जिस सी # कंपाइलर का उपयोग कर रहे हैं उसके आधार पर, आपको इसके बारे में चिंता करने की आवश्यकता नहीं हो सकती है: http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events- get-a-little-overhaul-in-c-4-part-i-locks.aspx –

4
public event EventHandler UpdateErrorIcons; 

आप उपयोग कर सकते

yourObbject.UpdateErrorIcons += YourFunction; 
2

add {} और remove {} केवल विशेष मामलों में जहां आप मैन्युअल रूप से घटना hookups संभालने की ज़रूरत है में किया जाता है बस ठीक है। हम केवल प्राणियों को सामान्य रूप से public event EventHandler UpdateErrorIcons; का उपयोग करते हैं जहां "EventHandler" पसंद का प्रतिनिधि होता है।

उदाहरण के लिए:

public delegate void MyEventDelegate(object sender, string param1); 
public event MyEventDelegate MyEvent;

ध्यान दें कि क्योंकि MyEvent रिक्त है यह किसी भी श्रोताओं आप अगर यह यह लागू करने से पहले रिक्त है जांच करने की जरूरत नहीं है, तो। इस चेक करने के लिए एक मानक तरीका है:

public void InvokeMyEvent(string param1) 
{ 
    MyEventDelegate myEventDelegate = MyEvent; 
    if (myEventDelegate != null) 
     myEventDelegate(this, param1); 
} 

इस चेक में एक प्रमुख तत्व पहला सवाल में वस्तु की एक प्रतिलिपि बनाने के लिए और फिर प्रति पर ही काम करते हैं।यदि नहीं, तो आप दुर्लभ दौड़ की स्थिति प्राप्त कर सकते हैं जहां एक और धागा आपके और आपके कॉल के बीच खुला रहता है।

+0

हां, हम आमतौर पर बाद में सिंक्रनाइज़ेशन जोड़ने के लिए इसका उपयोग करेंगे। – Carra

+0

@ कररा: जब तक मैं गलत नहीं हूं, .NET Framework के नवीनतम संस्करणों में 'add' और 'remove' का डिफ़ॉल्ट कार्यान्वयन वास्तव में सिंक्रनाइज़ेशन शामिल करता है। –

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