2011-03-13 15 views
14

मैंने ईवेंट हैंडलिंग के विभिन्न उदाहरण देखे हैं। यहां एक है: Event Sampleक्या कक्षा के अंदर एक प्रतिनिधि घोषित किया जाना चाहिए जो घटना को बढ़ाएगा, या बाहर?

कभी कभी मैं प्रतिनिधि वर्ग है कि घटना को बढ़ा देंगे (ऊपर के लिंक के रूप में) के बाहर घोषित देखते हैं, और कभी कभी अंदर (जहां मुझे लगता है कि यह घोषित किया जाना चाहिए)।

यह के अंदर घटना को बढ़ाने वाले वर्ग को घोषित करने के लिए मुझे अधिक समझ में आता है। कारण यह है कि कक्षा घोषित करने की घटना वास्तव में सहायक उपकरण के लिए केवल कुछ चीनी कोटिंग है जो वास्तव में प्रतिनिधि को जोड़ने, घटाने और आवेदक का आह्वान करने के लिए कर रही है।

क्या कोई सर्वोत्तम प्रथा है? क्या ऐसे समय होते हैं जब आप प्रतिनिधि को बाहर घोषित करना चाहते हैं, और दूसरी बार जहां आप प्रतिनिधि को घोषित करना चाहते हैं? यदि हां, तो यह कैसे तय किया जाना चाहिए कि क्या करना है?

उत्तर

19

आमतौर पर की एक बढ़ती संख्या का उपयोग कर का विचार है, इन दिनों आप चाहते अपने स्वयं के वर्ग EventArgs से व्युत्पन्न बनाने के लिए, और फिर बस EventHandler<TEventArgs> का उपयोग करें - एक अलग प्रतिनिधि प्रकार बनाने के लिए कोई आवश्यकता नहीं है। तो AlarmEventHandler के बजाय, आप EventHandler<AlarmEventArgs> का उपयोग करेंगे। EventArgs - निर्धारित वर्ग आमतौर पर शीर्ष-स्तर (यानी गैर-नेस्टेड) ​​होना चाहिए।

+0

ठीक है कि समझ में आता है। मैं कैसे उन्हें स्पष्ट ढंग से उपयोग करने के लिए है, जिसके कारण मैं अभी भी गैर-सामान्य प्रतिनिधियों पर ध्यान दे रहा हूँ (प्लस मैं 70-536 के लिए तैयारी कर रहा हूँ) के प्रतिनिधियों की एक बहुत अच्छी समझ पाने के लिए कोशिश कर रहा हूँ और। – richard

+0

@Richard: * समझ * प्रतिनिधियों के संदर्भ में, यह काफी अप्रासंगिक है कि क्या वे शीर्ष स्तर के प्रकार के रूप में है या नहीं घोषित कर रहे हैं। यह सुनिश्चित करने के लायक भी है कि आपको घटनाओं और प्रतिनिधियों के बीच अंतर पर दृढ़ समझ है। अधिक जानकारी के लिए http://csharpindepth.com/Articles/Chapter2/Events.aspx देखें। –

+0

धन्यवाद। मैंने ज्यादातर हफ्ते में प्रतिनिधियों, घटनाओं, और उनका उपयोग कैसे किया जाता है और वे क्या हैं (सीआईएल समेत, जब आप उन्हें घोषित करते हैं तब उत्पन्न होते हैं)। मैंने कुछ हफ्ते पहले अपनी पुस्तक खरीदी थी, लेकिन मैंने इसे अभी तक थोरूगली नहीं देखा था, और इसलिए पता नहीं था कि आपके पास प्रतिनिधियों और कार्यक्रमों पर एक अनुभाग है। ये इतनी उलझन में हैं क्योंकि कंपाइलर बहुत ही कम घोषणाओं के परिणामस्वरूप कर रहा है कि सी # उनका उपयोग करते समय प्रोत्साहित करता है। मैं इस लेख और आपकी पुस्तक में अनुभाग अब पढ़ूंगा! – richard

6

मैं उन्हें बाहर की घोषणा के रूप में वे के रूप में अच्छी अन्य वर्गों द्वारा प्रयोग की जाने जाहिर कर रहे हैं होगा - घटना के उपभोक्ताओं। यदि प्रतिनिधि इस वर्ग के लिए विशिष्ट है तो मैं प्रतिनिधि को उसी फ़ाइल में कक्षा के रूप में रखूंगा।

यदि आप EventHandler<TEventAgrs> के सामान्य संस्करण का उपयोग करते हैं, तो .NET 2.0 और नए में उपलब्ध होने पर यह समस्या कम है, क्योंकि आपको केवल अपना कस्टम EventArgs घोषित करने की आवश्यकता है।

+0

क्या आप प्रतिनिधि के लिए कोई विधि जोड़ते समय संदर्भित करते हैं, जैसे 'घड़ी। अलार्म + = नया अलार्मइवेंट हैंडलर (डब्ल्यू। अलार्मरंग); जहां' अलार्मवेन्ट हैंडलर 'प्रतिनिधि का उदाहरण है? – richard

+0

हां, वह वर्ग जो घटना को उजागर करता है और उस वर्ग को जो कक्षा का उपभोग करता है उसे प्रतिनिधि प्रकार को जानने की आवश्यकता होती है। मन में 'सूची .Enumerator' स्प्रिंग्स: जो इस आवश्यकता को अप्रचलित –

2

अगर मैं सही ढंग से याद, सार्वजनिक सुलभ नेस्टेड "वस्तुओं" CLR (कक्षा/structs/प्रतिनिधियों/enums) में की कुछ उदाहरण हैं। तो आमतौर पर प्रतिनिधि वर्ग के लिए "बाहरी" होते हैं।

लेकिन .NET 3.5 से आगे कर दिया गया है "सामान्य" प्रतिनिधियों (Func<T>, Action<T>, Predicate<T>) के बजाय असंगत प्रतिनिधियों

+0

बनाता है आप lambdas और अनाम प्रतिनिधियों उपयोग कर सकते हैं नेट के नए संस्करण में, वहाँ निश्चित रूप से कुछ हैं। –

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

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