2013-05-23 4 views
6

में एक घटना ऊपर उठाने से पहले ग्राहकों के लिए जाँच करने के लिए, आप कुछ इस तरह करते हैं:कैसे सी # में VB.NET

if (Changed != null) 
    Changed(this, EventArgs.Empty); 

लेकिन क्या आप VB.NET में क्या करते हो?

वहाँ RaiseEvent है, लेकिन

RaiseEvent Changed(Me, EventArgs.Empty) 

वास्तव में जांच करते हुए कि कुछ घटना की सदस्यता ली है है?

+1

http://msdn.microsoft.com/en-us/library/fwd3bwed%28v=vs.110%29.aspx – VikciaR

उत्तर

11

अपनी सी # बराबर के विपरीत, VB.NET में RaiseEvent अगर कोई श्रोताओं हैं नहीं एक अपवाद बढ़ा देंगे, यह बहुत पहले शून्य जांच करने के लिए कड़ाई से जरूरी नहीं है।

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

If ChangedEvent IsNot Nothing Then 
    RaiseEvent Changed(Me, EventArgs.Empty) 
End If 

जैसा कि मैंने ऊपर कहा, हालांकि, मैं वास्तव में यकीन है कि ऐसा करने के लिए किसी भी वास्तविक लाभ है अगर वहाँ नहीं हूँ। यह आपके कोड को गैर-मूर्खतापूर्ण और पढ़ने में अधिक कठिन बनाता है। मैं जिस चाल को यहां प्रस्तुत करता हूं वह विशेष रूप से अच्छी तरह से प्रलेखित नहीं है, संभवतः RaiseEvent कीवर्ड का पूरा बिंदु पृष्ठभूमि में आपके लिए यह सब संभालना है। यह वीबीएनईटी भाषा के दो डिजाइन लक्ष्यों, इस तरह से अधिक सुविधाजनक और सहज है।

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

EventHandler tmp = Changed; 
if (tmp != null) 
{ 
    tmp(this, EventArgs.Empty); 
} 

एरिक Lippert इस here के बारे में बहुत ब्लॉग लेख, this Stack Overflow question से प्रेरित है।

दिलचस्प है, अगर आप VB.NET कोड कि RaiseEvent कीवर्ड का इस्तेमाल करता disassembled जांच करते हैं, आप पाएंगे कि यह वास्तव में क्या ऊपर सही सी # कोड करता है क्या कर रहा है: एक अस्थायी चर वाणी, एक अशक्त जाँच करता है, और फिर प्रतिनिधि को आमंत्रित करता है। हर बार इस के साथ अपने कोड को अव्यवस्थित क्यों करें?

+0

हाँ, थ्रेड सुरक्षा के बारे में जानें।लेकिन कोड के लिए मैं लिखता हूं जब तक कि मुझे पता न हो कि मेरा कोड धागे के साथ प्रयोग किया जाएगा, मैं फ्रेमवर्क दृष्टिकोण के लिए जाता हूं: केवल मेरी स्थिर विधियों को थ्रेड सुरक्षित होने की गारंटी है। –

+0

@user जोखिम भरा है। जब भी संभव हो, आपको हमेशा थ्रेड-सुरक्षित कोड लिखने का प्रयास करना चाहिए, इस तरह जब आप बाद में वापस जाने और अतिरिक्त धागे जोड़ने का निर्णय लेते हैं, तो आपको सबकुछ से गुजरना और फिर से लिखना नहीं है। अगर मैं ऐसा कुछ लिखता हूं जो थ्रेड-सुरक्षित नहीं है और मैं इसके इरादे से नहीं चाहता हूं, तो मैं इस तरह के स्पष्टीकरण के साथ इसे अच्छी तरह से टिप्पणी करता हूं। बाद में बहुत दर्द बचाता है। –

2

एक प्रत्यक्ष रूपांतरण होगा:

If Changed IsNot Nothing Then 
    Changed(Me, EventArgs.Empty) 
End If 

हालांकिRaiseEvent VB.NET में घटनाओं को बढ़ाने के लिए इस्तेमाल किया जाएगा, तो आप बस घटना फोन नहीं कर सकते हैं। यदि कोई श्रोताओं नहीं हैं तो RaiseEvent का उपयोग करके कोई अपवाद नहीं फेंक दिया गया है।

देखें: http://msdn.microsoft.com/en-GB/library/fwd3bwed(v=vs.71).aspx

इसलिए निम्नलिखित इस्तेमाल किया जाना चाहिए:

RaiseEvent Changed(Me, EventArgs.Empty) 
+0

मैंने यह लेख देखा लेकिन यह नहीं कहता कि क्या कोई श्रोताओं नहीं होता है। –