2015-08-04 8 views
7

से पाने उपयोग नहीं कर सकते EventHandler<TEventArgs> के लिए दस्तावेज़ का कहना है:क्यों मैं सिर्फ eventhandler <int> बजाय EventArgs

दूसरा पैरामीटर एक प्रकार EventArgs और आपूर्ति किसी भी फ़ील्ड या गुण घटना धारण करने के लिए की जरूरत से प्राप्त होता है डेटा।

और ऐसा लगता है कि आमतौर पर नेट दस्तावेज़ों में अनुशंसित किया जाता है।

हालांकि यह पता चला है कि मैं जिसके बाद बस ठीक काम करता है कर सकते हैं:

public event EventHandler<int> Panned; 

और के रूप में ईवेंट हैंडलर आह्वान:

int value = 10; 
if (Panned != null) 
{ 
    Panned(this, value); 
} 

और पर्यवेक्षक की ओर:

subject.Panned += (sender, e) => 
{ 
    Console.WriteLine(e); 
}; 

मेरे लिए यहसे प्राप्त छोटे वर्गों के साथ कोड को कूड़ेदान से बेहतर लगता हैया के रूप में Does .NET have a built-in EventArgs<T>?

तो द्वारा प्रस्तावित कारण है कि यह आवश्यक है कि मैं EventArgs से EventHandler सामान्य तर्क के वारिस एक सामान्य EventArgs आ रही हैं?

+4

यदि आप .NET 4.0 या पुराने 'सार्वजनिक ईवेंट इवेंट हैंडलर पैन का उपयोग करते हैं, तो असफल हो जाएगा। [4.0 में] (https://msdn.microsoft.com/en-us/library/db0etb8x (v = vs.100) .aspx) इसमें एक 'जहां TEventArgs: EventArgs' बाधा थी। उस बाधा को [4.5 में] गिरा दिया गया था (https://msdn.microsoft.com/en-us/library/db0etb8x (v = vs.110) .aspx) –

+0

ओह दिलचस्प। यह जानकर अच्छा लगा। –

उत्तर

12

यदि आपको केवल int को हैंडलर पर पास करना है तो आप जो कर रहे हैं वह ठीक है।

यह इस्तेमाल किया मामला ( से पहले .NET 4.5) कि EventHandler प्रकार तर्क TEventArgsEventArgs से विरासत के लिए विवश किया गया था लेकिन अब और नहीं होने के लिए:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); 

तथ्य यह है कि एमएस बाधा गिरा आपको बताना चाहिए कि वे बहुत सख्त थे और आप जो कर रहे हैं वह ठीक है।

यदि आपको हैंडलर को जटिल प्रकार को पारित करने की आवश्यकता है तो आपको भी पॉलिफोर्फिज्म के कारणों के लिए EventArgs का उत्तराधिकारी हो सकता है। इसके अलावा, EventArgs.Empty सदस्य उपयोगी है।

+0

इसके अलावा, यदि आपका ईवेंट डिफ़ॉल्ट 'EventHandler' प्रतिनिधि के व्युत्पन्न के साथ वायरस नहीं करता है, तो पावरहेल (कम से कम 4 तक) दुर्भाग्य से और क्रैश हो जाएगा यदि आप' रजिस्टर-ऑब्जेक्टिवेंट 'का उपयोग करके हैंडलर सेट करने का प्रयास करते हैं – Eris

2

यह सिर्फ एक सम्मेलन है। वास्तव में, आपको EventHandler<> जेनेरिक प्रतिनिधि का भी उपयोग नहीं करना है। आप हो सकते हैं:

public event Action SomeEvent; 

public void OnAction() 
{ 
    var a = this.SomeEvent; 
    if (a != null) 
    { 
     a(); 
    } 
} 

बेशक, सम्मेलन एक कारण के लिए है। जहां तक ​​मुझे पता है, प्रत्येक मानक .NET ईवेंट शून्य-रिटर्निंग प्रतिनिधि का उपयोग करने के पैटर्न का पालन करता है जो object पैरामीटर और EventArgs या व्युत्पन्न प्रकार का दूसरा पैरामीटर लेता है। यह हर बार प्रलेखन को संदर्भित किए बिना इन घटनाओं का उपयोग करना आसान बनाता है।

मूर्ख, मूर्ख, मूर्ख!

क्या यह काम ...

class Program 
{ 
    public static event Func<int> SomeEvent; 

    static void Main(string[] args) 
    { 
     SomeEvent +=() => 7; 
     SomeEvent +=() => 8; 
     var a = SomeEvent(); 
     Console.WriteLine(a); 
    } 
} 

मैं इसे करने की कोशिश की: यह करता है! बेशक, यह एक ऐसा ईवेंट है जहां प्रतिनिधि के पास वापसी मूल्य होता है, क्योंकि यह स्पष्ट नहीं है कि एकाधिक संलग्न हैंडलर हैं तो हैंडलर का मूल्य कॉलर को वापस कर दिया जाएगा। उपर्युक्त उदाहरण में, यह पता चला है कि 8 कंसोल पर लिखा गया है।

दिलचस्प लेकिन, मुझे लगता है, बेकार ;-)

आप कभी भी इस का प्रयोग करेंगे?

मुझे नहीं लगता यह मेरे उदाहरण में एक गैर-शून्य वापसी प्रतिनिधि प्रकार के लिए कभी भी समझदार होगा। हालांकि, आप पर विचार कर सकते हैं एक प्रतिनिधि का उपयोग करके जिसका पैरामीटर प्रदर्शन कारणों के लिए मूल्य प्रकार (structs, कक्षा नहीं) हैं। ढेर पर EventArgs ऑब्जेक्ट्स आवंटित करने के कचरा संग्रहण जुर्माना के बिना घटनाओं का उपयोग करना संभव हो सकता है।

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