2012-03-11 14 views
5

Are EventArg classes needed now that we have generics और Does .NET have a built-in EventArgs<T>? पर पोस्टर सामान्य जेनरेशन के खिलाफ सलाह दे रहे हैं, कम से कम मुझे यह महसूस हो रहा है।अंतर्निहित प्रकारों के लिए जेनेरिक इवेंट एरग

क्या इसे उपयोग करने के लिए उचित है जब मुझे केवल बिल्ड-इन प्रकारों में से एक है? मेरे विशिष्ट मामले में मैं टीसीपी पर एक स्ट्रीम से पढ़ रहा हूं, और जब डेटा प्राप्त होता है, तो ग्राहकों को अधिसूचित किया जाता है।

public event EventHandler<EventArgs<string>> data_received = delegate { }; 

... 

while (!reader.EndOfStream) 
{ 
    if ((data = reader.ReadLine()) != "") 
    { 
     this.data_received(this, new EventArgs<string>(data)); 
    } 
} 

या शायद एक घटना ग्राहकों को डेटा पास करने का सबसे अच्छा तरीका नहीं है?

उत्तर

5

संक्षिप्त उत्तर: यह निर्भर करता है।

आप EventArgs<T> कक्षा Tuple<T> पर विधि से डेटा को पास करने और पुनर्प्राप्त करने के लिए विचार कर सकते हैं। कुछ साधारण मामलों में और आंतरिक उपयोग के लिए Tuple<T> उपयुक्त है लेकिन अधिक जटिल मामलों के लिए या सार्वजनिक सतह के लिए यह अलग-अलग प्रकार का उपयोग करने के लिए अधिक उपयुक्त होगा।

EventArgs<T> के साथ हमारे पास एक ही दुविधा है। आंतरिक उपयोग के लिए इस प्रकार का उपयोग करने के लिए ठीक है, लेकिन सार्वजनिक एपीआई के लिए यह रखरखाव दुःस्वप्न का कारण बन सकता है।

आपके विशेष मामले में पहली नज़र में EventArgs<T> का उपयोग करना ठीक लगता है, लेकिन यदि बाद में आप EndPoint की तरह कुछ अतिरिक्त जानकारी जोड़ने का निर्णय लेंगे? इस मामले में आप EventArgs<T, U> (जैसे Tuple<T, U>) का उपयोग कर सकते हैं या आप कस्टम EventArgs कक्षा पर स्विच कर सकते हैं। दोनों स्थितियों में आप अपने सभी क्लाइंट तोड़ देंगे और यदि आप इस कोड के केवल एक ग्राहक हैं - ठीक है, लेकिन यदि नहीं ...

आंतरिक सामग्री के लिए नीचे की रेखा, EventArgs का उपयोग करने के लिए ठीक है, लेकिन सार्वजनिक सतह के लिए I कस्टम इवेंट तर्क का उपयोग करने का सुझाव देते हैं।

पीएस घटनाओं के लिए सामान्य नामकरण सम्मेलन CamelCase है, और आपके विशेष मामले में इसका मतलब है कि DataReceived आपके ईवेंट के लिए अधिक उपयुक्त नाम है।

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