2012-05-24 14 views
6

संभव डुप्लिकेट:
Is there a downside to adding an anonymous empty delegate on event declaration?क्या हमेशा एक खाली ईवेंट हैंडलर जोड़ना ठीक है?

निम्नलिखित पैटर्न काफी आम है जब ईवेंट हैंडलर्स (सी # में) का उपयोग:

public event Action handler; 
… 
// some method: 
if(handler != null) handler(); 

वहाँ एक खाली बताए के किसी भी कमियां हैं इस घटना के लिए प्रतिनिधि? यह हर जगह if !=null स्थिति को बचाएगा, जहां ईवेंट निकाल दिया गया है। बेशक, यह केवल तभी लागू होता है, जब हम गारंटी नहीं दे सकते कि घटना हमेशा एक उचित प्रतिनिधि को सौंपी जाती है।

public event Action handler; 
… 
// in constructor: 
handler +=()=>{}; 
… 
// some method: 
handler(); 

निश्चित रूप से, थोड़ा सा प्रदर्शन मारा गया है, लेकिन यह कोड को अधिक क्लीनर बनाता है। ऐसे मामले में सबसे अच्छा अभ्यास क्या है? कोई तकनीकी नुकसान?

+0

मेरे दृष्टिकोण से एक अच्छा अभ्यास नहीं है। हां, आप एक शून्य जांच को बचाते हैं, लेकिन कुछ महीने बाद, बग या रखरखाव के लिए कोड का निरीक्षण करते समय, पहला उदाहरण कोड के उद्देश्य को बेहतर ढंग से प्रदर्शित करता है। – Steve

+1

यह और भी बदतर हो जाता है - सुरक्षा के बिना, 'हैंडलर' को शून्य के लिए जांचने और इसे आमंत्रित करने के बीच शून्य पर सेट किया जा सकता है। आपको 'हैंडलर' के मान को स्थानीय चर में कॉपी करना चाहिए और शून्य के लिए _that_ की जांच करनी चाहिए। –

+0

आपका पहला कोड टूटा हुआ है क्योंकि आप 'हैंडलर' के मान को स्थानीय चर में कॉपी नहीं करते हैं। – CodesInChaos

उत्तर

1

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

private void HandlerWrapper() 
{ 
    Action localHandler = handler; 
    if (localHandler != null) handler(); 
} 
+1

मूल कोड के रूप में समान थ्रेड सुरक्षा समस्याएं – CodesInChaos

1

दिलचस्प विचार, मैंने कभी ऐसा करने का विचार नहीं किया है। जिस तरह से मैं अपनी कस्टम घटनाओं को करता हूं, मैं ईवेंट के लिए ऑन-कस्टमवेन्टनाम लेआउट पैरामीटर करता हूं और बस वहां शून्य में चेक करता हूं। और कोड से OnCustomEventName को कॉल करें जहां भी मैं ईवेंट ट्रिगर करता हूं। किसी भी प्रदर्शन हिट से बचता है और यदि आप ईवेंट को निकालते समय हर बार जांच करते हैं तो 2-लाइन की तुलना में परिचालन कोड क्लीनर रखता है।

कहा जा रहा है कि यह तकनीकी नुकसान के बारे में सवाल का जवाब नहीं दे रहा है लेकिन घटनाओं को फायर करते समय सबसे अच्छा अभ्यास है।

थ्रेडसेफ "ऑन" फ़ंक्शन के लिए उदाहरण कोड।

private void OnCustomEventName() 
{ 
    DelegateName localhandler = CustomEventName; 
    if (localhandler != null) 
     localhandler(); 
} 
0

मुझे वास्तव में ऐसा करने के लिए कोई बड़ी डाउनसाइड्स नहीं मिली है और आम तौर पर मैं इसे शून्य के लिए जांचना पसंद करता हूं। एकमात्र मुद्दा जो मैं सोच नहीं सकता वह यह है कि जब भी किसी ईवेंट में कदम उठाने पर खाली प्रतिनिधि को कदम उठाना पड़ता है तो यह डीबगिंग (यानी ) पर कोड में कष्टप्रद कदम उठा सकता है।

मुझे लगता है कि प्रदर्शन कोई मुद्दा नहीं है - यदि एप्लिकेशन का प्रदर्शन घटनाओं का आह्वान करके महत्वपूर्ण रूप से खराब हो जाता है, तो शायद यह संभवतः पहले स्थान पर नहीं होना चाहिए था।