2010-06-30 21 views
6

हम अक्सर बस के रूप में नीचे सी # में ईवेंट हैंडलर का उपयोग करें,:ईवेंट हैंडलर पंजीकरण कब होता है?

some_event+=some_event_handler; 

इस संकलन समय या चलाने के समय में होता है? क्या होगा यदि some_event स्थिर सदस्य है? AFAIK, some_event में कुछ_event_handler के प्रविष्टि पते के अलावा कुछ भी नहीं है, और कुछ_event_handler का विधि पता संकलित समय पर निर्धारित किया जा सकता है। अगर some_event एक स्थैतिक सदस्य है, तो कुछ_वेन्ट का मान संकलन समय पर निर्धारित किया जा सकता है? मुझे पता है कि अगर some_event एक आवृत्ति सदस्य है, तो यह मान वस्तु उदाहरण के निर्माण समय पर स्थापित किया जाएगा। यदि मैं गलत हूं तो मुझे सही करों।

बहुत धन्यवाद, लोग ~ :)

+0

एक छोटा नोट: "some_event" में एंट्री पतों की एक * सूची * है, यह संभव है कि एकाधिक हैंडलर एक ही घटना की सदस्यता लें। –

+0

याद दिलाने के लिए धन्यवाद हंस। – smwikipedia

उत्तर

0

सदस्यता क्रम में क्या होता है पर पंजीकृत हैं। यह सशर्त अंदर हो सकता है।

+0

धन्यवाद पावेल। मुझे सिर्फ सबूत चाहिए। ;) – smwikipedia

+0

गणितीय सबूत की तरह एक सबूत?:) ठीक है, अगर यह संकलन समय पर होगा, तो सब्सक्रिप्शन समय पर ज्ञात नहीं होने पर यह तथ्य सशर्त रूप से सदस्यता लेने में सक्षम नहीं होगा। वैसे भी, एमएसआईएल देखें। –

+0

अच्छा और तार्किक। धन्यवाद। – smwikipedia

0

आप उन्हें ट्रैक करने के लिए की जरूरत है हो सकता है आप के मैनुअल घटना कीवर्ड add और remove साथ निपटने की जरूरत है। (उदाहरण के 2 से पर)

और यह http://msdn.microsoft.com/en-us/library/8627sbea(VS.71).aspx पर एक नजर डालें हाँ, मैं भूल गया, घटनाओं क्रम

+0

धन्यवाद Astorcas, मैं उस पर एक नज़र डालेगा। – smwikipedia

1

हम कह सकते हैं कि यह delegates से संबंधित है। एक delegate परिवर्तनीय गतिशील रूप से एक विधि असाइन किया गया है। यह हमें प्लगइन विधियों को लिखने की क्षमता देता है।

संक्षेप

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

+0

धन्यवाद गुप्त, आपके द्वारा प्रदान की जाने वाली जानकारी बहुत जानकारीपूर्ण है। – smwikipedia

0

कोड एक विधि कॉल के समान ही एक कथन है, और इस प्रकार प्राकृतिक निष्पादन धारा में आपके द्वारा रखे गए बिंदु पर होता है, चाहे वह लूप, if-statement या इसी तरह के अंदर हो।

इस तरह, कथन को निष्पादित करने से पहले, घटना को ईवेंट हैंडलर असाइन नहीं किया गया है। इससे कोई फर्क नहीं पड़ता (इस संदर्भ में) क्या घटना एक स्थिर या आवृत्ति घटना है।

आप विचार कर सकते हैं कि कैसे कोड इस कोड से तुलना करके बर्ताव करता है:

some_event = Delegate.Combine(some_event, some_event_handler); 

तो यह स्पष्ट है कि यह सिर्फ एक बुनियादी विधि कॉल, और कुछ नहीं है होना चाहिए।

event += handler का सिंटैक्स उपर्युक्त कोड के लिए केवल छोटा हाथ है, और संकलक उस विधि कॉल में वाक्यविन्यास का अनुवाद करेगा। यदि आप Reflector का उपयोग करते हैं तो आप देख सकते हैं कि यह कैसे किया जाता है।

एमएसडीएन पर Delegate.Combine देखें।

+0

धन्यवाद लास, आप मेरे लिए कुछ धुंध साफ़ करते हैं। ;) – smwikipedia

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