2009-08-23 3 views
12

मेरे पास एक ऐसा ईवेंट है जिसे वर्तमान में कोई ईवेंट तर्क के साथ परिभाषित नहीं किया गया है। यही है, इवेंटआर्ग भेजता है EventArgs.Empty है।क्या कोई ऐसा ईवेंट होना चाहिए जिसमें कोई तर्क नहीं है, अपने स्वयं के कस्टम EventArgs को परिभाषित करें या बस System.EventArgs का उपयोग करें?

इस मामले में, यह मेरे ईवेंट हैंडलर घोषित करने के लिए के रूप में सरल है:

EventHandler<System.EventArgs> MyCustomEvent; 

मैं इस घटना के लिए किसी भी घटना तर्क जोड़ने पर योजना नहीं है, लेकिन यह संभव है कि किसी भी कोड में परिवर्तन करने की आवश्यकता सकता है भविष्य।

इसलिए, मैं अपने सभी कार्यक्रमों को हमेशा एक खाली घटना तर्क बनाने की दिशा में झुका रहा हूं कि System.EventArgs से इनहेरेटिस, भले ही वर्तमान में कोई ईवेंट तर्क नहीं है। कुछ इस तरह:

public class MyCustomEventArgs : EventArgs 
{ 
} 

और फिर मेरी घटना परिभाषा निम्नलिखित हो जाता है:

EventHandler<MyCustomEventArgs> MyCustomEvent; 

तो मेरे सवाल यह है: यह मेरे अपने MyCustomEventArgs परिभाषित करने के लिए बेहतर है, भले ही वह परे कुछ भी नहीं जोड़ता है System.EventArgs से विरासत में, ताकि घटना तर्क भविष्य में और आसानी से जोड़ा जा सके? या System.EventArgs लौटने के रूप में स्पष्ट रूप से मेरी घटना को परिभाषित करना बेहतर है, ताकि उपयोगकर्ता के लिए यह स्पष्ट हो कि कोई अतिरिक्त ईवेंट तर्क नहीं है?

मैं अपने सभी कार्यक्रमों के लिए कस्टम इवेंट तर्क बनाने की दिशा में झुका रहा हूं, भले ही ईवेंट तर्क खाली हों। लेकिन मैं सोच रहा था कि क्या दूसरों ने सोचा कि उपयोगकर्ता को यह स्पष्ट करना है कि घटना तर्क खाली हैं बेहतर होगा?

अग्रिम में बहुत धन्यवाद,

माइक

+0

मैं बस इवेंट हैंडलिंग से परिचित हूं। मैं सिर्फ पुष्टि करना चाहता था कि 'EventHandler <ऑब्जेक्ट, MyCustomEventArgs>' एक टाइपो जो 'EventHandler ' होना चाहिए? यदि नहीं, तो यह वर्ग कहां रहता है? – fostandy

+0

हां, अच्छा पिकअप, आप सही हैं, जो पढ़ना चाहिए: 'EventHandler ', जिसे मैंने अभी सही किया है। तथ्य यह है कि प्रेषक एक वस्तु है 'EventHandler <> 'वर्ग का उपयोग करते समय निहित है। इस पर एक और लेने के लिए, आप ".NET में इवेंट हस्ताक्षर - एक मजबूत टाइप किए गए 'प्रेषक का उपयोग कर देखना चाहते हैं?" (http://stackoverflow.com/questions/1046016/event-ignature-in-net-using-a-strong-typed-sender), लेकिन यह वैकल्पिक दृष्टिकोण गैर-मानक है, इसलिए हो सकता है कि आप इस मार्ग पर नहीं जाना चाहें एक शुरुआत के रूप में। हालांकि यह दिलचस्प है, और यह बहुत अच्छी तरह से काम करता है। –

उत्तर

14

Framework Design Guidelines से ब्राड अब्राम और क्रिस्टोफ़ क्वालीना द्वारा: जब तक आप पूरी तरह से सुनिश्चित घटना तब घटना प्रबंधन विधि के लिए किसी भी डेटा ले जाने की आवश्यकता कभी नहीं होगा रहे हैं

, घटना तर्क के रूप में EventArgs का एक उपवर्ग उपयोग पर विचार करें, इस मामले में आप सीधे EventArgs प्रकार का उपयोग कर सकते हैं।

यदि आप सीधे EventArgs का उपयोग करके एक एपीआई शिप करते हैं, तो आप संगतता को तोड़ने के बिना ईवेंट के साथ किए जाने वाले किसी भी डेटा को कभी भी जोड़ने में सक्षम नहीं होंगे। यदि आप सबक्लास का उपयोग करते हैं, भले ही प्रारंभ में पूरी तरह खाली हो, फिर भी जब आवश्यक हो तो आप सबक्लास में गुण जोड़ सकेंगे।

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

+0

+1 आपके लिए +1 है। यदि उसका मामला एचजीएनआई है;) –

+0

हां, यह एक क्लास लाइब्रेरी है जिसे दूसरों द्वारा खाया जाएगा, इसलिए मुझे लगता है कि यह जाने का रास्ता है, और इसलिए मैं पहली बार इस तरह झुका रहा था। मैं निश्चित रूप से यथासंभव डिजाइन दिशानिर्देशों का पालन करना पसंद करता हूं। धन्यवाद, एड्रियन, फ्रेमवर्क डिजाइन दिशानिर्देशों सहित, इस तरह के एक पूर्ण उत्तर के लिए। –

9

YAGNI

मैं EventArgs साथ रहना और केवल एक और बात का उपयोग जब तुम सच में इसकी जरूरत बन सुझाव देते हैं।


अद्यतन:

रूप adrianbanks ने बताया अगर अपने कोड अन्य कोड जो आपके नियंत्रण में (यानी कोड है कि आप अपने संकलन नहीं कर सकता) नहीं है या द्वारा खपत होने जा रही है यदि उपभोक्ता कोड को पुन: संकलित करना एक परेशानी होगी, तो आपको इवेंट हैंडलर <YourEventArgs> का उपयोग करना चाहिए।

+0

आपके संतुलित उत्तर के लिए धन्यवाद, अल्फ्रेड। हां, जब मैंने इस सवाल को पोस्ट किया तो यागनी निश्चित रूप से मेरे दिमाग में थी। अधिकतर, मुझे कक्षाओं के साथ अपने ऑब्जेक्ट मॉडल को अव्यवस्थित करने का विचार पसंद नहीं है जो केवल सिस्टम का प्रतिनिधित्व करता है। EventArgs, उर्फ ​​EventArgs.Empty। कुल मिलाकर, हालांकि, मेरी कक्षा पुस्तकालय अन्य परियोजनाओं द्वारा खपत की जाती है और मैं लचीलापन और फ्रेमवर्क डिजाइन guiedlines के बाद इस पर जा रहा हूं। इसलिए मैंने एड्रियन को चेक मार्क दिया, लेकिन मैंने आपको +1 वोट दिया। विचार करने के लिए बाहरी निर्भरताओं को इंगित करने के लिए –

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

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