2011-02-08 9 views
5

सभी .NET पुस्तक में मैंने ईवेंट को कार्यान्वित करने के लिए गाइड लाइन पढ़ी है, यह बताती है कि आपको EventArgs उप-वर्ग करने की आवश्यकता है और EventHandler का उपयोग करें। मैंने http://msdn.microsoft.com/en-us/library/ms229011.aspx पर अधिक जानकारी देखी, और यह कहता है "ईवेंट हैंडलर के रूप में उपयोग करने के लिए मैन्युअल रूप से नए प्रतिनिधि बनाने के बजाय System.EventHandler का उपयोग करें।" मैं समझता हूं कि EventArgs का उपयोग करने के महत्वपूर्ण कारण हैं, लेकिन मेरा सवाल यह नहीं है कि "क्या मुझे ऐसा करना चाहिए?", लेकिन "क्या मैं इसे इस तरह से कर सकता हूं?"।क्या EventArgs क्लास और ईवेंट कीवर्ड के बीच कोई विशेष संबंध है?

क्या कोई कारण है कि मैं अपने कार्यक्रमों के साथ EventHandler के बजाय एक सामान्य प्रतिनिधि का उपयोग नहीं कर सकता? उदाहरण के लिए, अगर मैं दृढ़ता से टाइप किए गए प्रेषक को चाहता हूं (कोई और object sender से नाराज हो?)।

यह समझाने के लिए कि मेरा क्या मतलब बेहतर है, क्या कोई कारण नहीं है कि निम्नलिखित काम नहीं करेंगे?

public class IoC 
{ 
    public AbstractFactory GetAbstractFactory() 
    { 
     var factory = new AbstractFactory(); 
     factory.CreateObject +=()=>new object(); 
     return factory; 
    } 
} 
public class AbstractFactory 
{ 
    public event Func<object> CreateObject; 

    private object OnObjectCreated() 
    { 
     if(CreateObject == null) 
     { 
      throw new Exception("Not injected."); 
     } 
     return CreateObject(); 
    } 


    private object _injectedObject; 
    public object InjectedObject 
    { 
     get 
     { 
      if(_injectedObject == null) 
      { 
       _injectedObject = OnObjectCreated(); 
      } 
      return _injectedObject; 
     } 
    } 
} 
+0

मैंने एक अवलोकन संग्रह के समान कुछ लागू करने के लिए बिल्कुल किया है। – asawyer

+0

संबंधित धागा: http://stackoverflow.com/questions/4828212/should-eventhandler-always-be-used-for-events/4828233 – CodesInChaos

उत्तर

5

यह सिर्फ सम्मेलन है, और भाषा की कोई आवश्यकता नहीं है। आप किसी भी प्रतिनिधि प्रकार को किसी ईवेंट के रूप में उपयोग कर सकते हैं।

मानक EventHandler<T> हस्ताक्षर हालांकि कुछ लाभ हैं:

  1. आप EventArgs पैरामीटर विस्तार कर सकते हैं। यह तब काम नहीं करेगा यदि आपके पास ईवेंटहैंडर में प्रत्येक चीज के लिए एक पैरामीटर था।
  2. एक eventhandler जो स्वीकार करता है EventArgs आधार स्तरीय सम्मेलन
  3. आप EventHandler<T> जो सभी घटनाओं पर प्रकट करने के विस्तार के तरीकों में जोड़ सकते हैं के बाद किसी भी घटना के लिए सदस्यता ले सकते हैं।
  4. वापसी का प्रकार void है। अन्य रिटर्न प्रकार घटनाओं के रूप में ज्यादा समझ में नहीं आता है।
  5. आप सम्मेलन का पालन कर रहे हैं। सम्मेलन के बाद आमतौर पर एक अच्छा विचार होता है, जब तक कि आपके पास आकर्षक तर्क न हो।
3

माइक्रोसॉफ्ट के सभी दस्तावेज बेस क्लास पुस्तकालयों और/या सामान्य ढांचे डिजाइन दिशानिर्देशों के डिजाइन के बारे में हैं। आप जो भी पैटर्न चाहते हैं उसका उपयोग कर सकते हैं।

यह कहा गया कि, यदि लोग आपके कोड का उपभोग करेंगे तो यह उनसे अधिक परिचित होगा यदि आप Microsoft द्वारा उपयोग किए जाने वाले पैटर्न का पालन करते हैं।

0

जहाँ तक मुझे पता है, EventHandler और EventArgs सर्वोत्तम प्रथाएं हैं, लेकिन किसी ईवेंट घोषणा में किसी भी मनमानी प्रतिनिधि का उपयोग करने से रोकने के लिए कुछ भी नहीं है। ईवेंट कीवर्ड आपको ईवेंट स्लॉट में + = और - = प्रतिनिधियों को सक्षम करने की विशेष कार्यक्षमता देता है, क्योंकि प्रतिनिधि प्रतिनिधि के क्षेत्र या संपत्ति के विरोध में, जो केवल एक प्रतिनिधि को स्वीकार करेगा (जब तक कि आप एकाधिक प्रतिनिधि नहीं लिखते स्वयं)।

चेतावनी: मुझे अनिश्चितता है कि किसी ईवेंट स्लॉट में रिटर्न मूल्यों वाले प्रतिनिधियों के साथ क्या होता है। मेरा अनुमान है कि वापसी मूल्यों को त्याग दिया जाता है, क्योंकि घटना के लिए आवंटित रिटर्न मूल्य वाले कई प्रतिनिधियों को संभालना मुश्किल होगा। हालांकि इसके लिए कुछ प्रयोग की आवश्यकता होगी।

+0

अंतिम मान वापस किया गया है। लेकिन यह बेकार है। –

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