2009-09-28 14 views
26

मैं थोड़ी देर के लिए ऐसा कर रहा हूं, लेकिन मैंने यह नहीं देखा है कि जब भी मैं इवेंट हैंडलर हटाता हूं तो मैं new का उपयोग कर रहा हूं। क्या मुझे एक नई वस्तु बनाना चाहिए?सी # एक ईवेंट हैंडलर को हटा रहा है

असल में 1 और 2 के बीच कोई अंतर है?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

संपादित करें: ठीक है यह डुप्लिकेट है। उसके लिए माफ़ करना। उत्तर here पोस्ट किया गया।

उसी प्रकार के दो प्रतिनिधियों को एक ही लक्ष्य, विधियों और आमंत्रण सूचियों के बराबर माना जाता है।

उत्तर

29

में 1 और 2 के बीच कोई अंतर नहीं है, क्योंकि 2 1 के लिए वाक्य रचनात्मक चीनी है। केवल 2 यदि वास्तविक विधि नाम के बजाय कक्षा-स्तर प्रतिनिधि उदाहरण फ़ील्ड को संदर्भित किया गया है तो केवल एक अंतर होगा संकलित आईएल में।

रनटाइम पर क्या होता है, इस मामले में, घटना Remove विधि इस बात पर ध्यान नहीं देती है कि प्रतिनिधि उदाहरण इसे पास कर दिया गया है या नहीं, जैसा कि Add विधि को पारित किया गया है। मुझे यह याद नहीं है कि यह क्यों है, लेकिन मुझे लगता है कि प्रतिनिधि उदाहरण हमेशा इंटर्न किए जाते हैं।

संपादित करें: जॉन स्कीट कि घटना Remove विधि मूल्य समानता (Delegate.Equals) का उपयोग करता है जो प्रतिनिधि सूची से निकालना, बल्कि + संदर्भ समानता होना शामिल की तुलना में निर्धारित करने के लिए कहते हैं। वही अंतिम परिणाम, अलग विधि। :-)

+0

चूंकि एक प्रतिनिधि केवल एक विधि और एक (वैकल्पिक) उदाहरण का संदर्भ है, उन दोनों की तुलना समानता निर्धारित करने के लिए पर्याप्त होनी चाहिए। – Botz3000

+0

हां, लेकिन आम तौर पर बोलते हुए, यदि आप मनमाने ढंग से संदर्भ प्रकार पर 'नया टी() 'दो बार कॉल करते हैं तो आपको दो अलग-अलग उदाहरण मिलेंगे। चूंकि यह प्रतिनिधियों के लिए मामला नहीं है, इसलिए मैं यह समझता हूं कि प्रतिनिधि कन्स्ट्रक्टर स्वचालित रूप से 'टाइप' क्लास की तरह उदाहरणों को इंटर्न कर रहा है। –

+0

प्रशिक्षित - इसका क्या अर्थ है? जवाब के लिए धन्यवाद। इस तरह के संदेह मुझे संदेह था। मैं उस नए बारे में सोच रहा था क्योंकि जब मैं इसे एक हैंडलर जोड़ता हूं और इसे हटाते समय नया बना देता हूं तो मैं एक नया उदाहरण बना रहा हूं। बहुत अजीब। – Sharun

13

दूसरा संस्करण पहले के बराबर है; यह सिर्फ एक छोटे वाक्यविन्यास का उपयोग करता है। इसे सी # 2.0

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