2011-06-09 11 views
9

मेरे समझ है कि किसी भी घटना संचालकों सी # में तार जैसे unwired होने की जरूरत है मत करो।आप "unwire" करने की जरूरत है एक गुमनाम समारोह/लैम्ब्डा

Object myObject = new Object(); 
myObject.Event += EventHandler; //Wired 
myObject.Event -= EventHandler; //Unwired 

लेकिन क्या आपको निम्न कोड को अनचाहे करने की आवश्यकता है? और यदि हां, तो कैसे?

Object myObject = new Object(); 
myObject.Event += (object sender, EventArgs e) => { }; //Wired 
myObject.Event -= ????? //Unwire? How? 

मेरे धारणा नहीं है?

+0

आप स्पष्ट कर सकते हैं कि क्या अपनी समझ है:

आप इस प्रकार इसे हटा सकते हैं? ** (*) ** के लिए – AakashM

उत्तर

10

हाँ, आप की जरूरत करने के लिए (*) और आप इस तरह यह सब करने की ज़रूरत:

Object myObject = new Object(); 
EventHandler handler = (object sender, EventArgs e) => { }; 
myObject.Event += handler; //Wired 
myObject.Event -= handler; //Unwired 

एक स्पष्टीकरण के लिए here देखें।

(*)
आप कचरा संग्रहण की वजह से यह सब करने की ज़रूरत नहीं है। यदि आप नहीं चाहते हैं कि ईवेंट आपके हैंडलर को और कॉल करे, तो आपको इसे करने की ज़रूरत है।

अद्यतन:
थोड़ा स्पष्ट करने के लिए:
एकमात्र कारण, क्यों आप एक ईवेंट हैंडलर unwire करना चाहते हैं कि वस्तु ईवेंट हैंडलर को परिभाषित कचरा एकत्र किया जा सकता है।
निम्न उदाहरण के बारे में सोचो:

  • आप एक घटना BlackOut के साथ एक कक्षा PowerSource है।
  • आप एक वर्ग LightBulb कि पर होगा, जब तक बिजली नहीं है के रूप में की है। इसमें एक विधि ConnectToPowerSource है। इस विधि की आपूर्ति की PowerSource की BlackOut घटना का सदस्य बनता।
  • आप एक संग्रह है कि प्रकाश बल्ब

अब होता है, बस सूची से एक प्रकाश बल्ब यह कचरा एकत्र प्राप्त नहीं होगा को दूर करने के लिए है क्योंकि PowerSource अभी भी में LightBulb उदाहरण के लिए एक संदर्भ रखा है इसके BlackOut घटना। केवल BlackOut घटना से LightBulb पंजीकरण रद्द करने के बाद LightBulb प्राप्त कचरा एकत्र कर देगा।

+0

+1। क्योंकि आपने कभी ** ** को अनचाहे करने के लिए ** नहीं किया है, आपको बस इसकी आवश्यकता है या इसकी आवश्यकता नहीं है। –

+1

आप अपने '(*)' वाक्य से क्या मतलब है? जब तक ईवेंट हैंडलर मौजूद है, तब तक यह सभी कब्जे वाले स्थानीय चर एकत्र किए जाने से रोक देगा। तो तुम यह जीसी की वजह से भी ऐसा करने के लिए (कम से कम अगर घटना के प्रकाशक बहुत लंबे समय तक रहता है उपभोक्ता की तुलना में) की जरूरत है। लेकिन निश्चित रूप से अनचाहे के लिए सबसे आम कारण यह है कि आप नहीं चाहते हैं कि आपका इवेंटहालर अब और कहलाए।(मैं डाउनवॉटर नहीं हूं) – CodesInChaos

+0

मेरा मतलब यह है कि: यदि myObject की अब आवश्यकता नहीं है और सभी संदर्भ समाप्त हो गए हैं, तो यह कवेंट होगा, इसके ईवेंट हैंडलर को दिए गए अज्ञात तरीकों के साथ। यदि myObject अभी भी उपयोग किया जाता है, लेकिन आप नहीं चाहते हैं कि आपका विशिष्ट ईवेंट हैंडलर अब और नहीं आना चाहिए, तो आपको इसे अनचाहे करने की आवश्यकता है, जिसके बाद इसका कचरा संग्रह हो जाएगा, यदि इसका कोई संदर्भ अब सहेजा नहीं गया है। मुझे लगता है, मैं जो कहना चाहता हूं वह है: मेरे ऑब्जेक्ट को इकट्ठा करने के लिए आपको इसे अनचाहे करने की आवश्यकता नहीं है। लेकिन वास्तव में अज्ञात तरीकों से कोई लेना देना नहीं है और यह सभी घटना हैंडलरों के लिए मामला है। –

1
Object myObject = new Object(); 
EventHandler h = (object sender, EventArgs e) => { }; //Wired 
myObject.Event += h; 
myObject.Event -= h; 

या, हैंडलर में unwire रहे हैं:

Object myObject = new Object(); 
EventHandler h = null; //need to declare h to use it in the following line 
//compiler/resharper will complain about modified closure 
h = (object sender, EventArgs e) => { myObject.Event-=h; }; 
myObject.Event += h; 
2

हाँ, आप की क्या ज़रूरत है। चूंकि कोई ईवेंट एक मजबूत संदर्भ है, इसलिए आपका ईवेंट हैंडलर जारी रहेगा। - आप 'होने की जरूरत है' से क्या मतलब है

EventHandler handler = (s,e) => { DoSomething(); } 
myObject.Event += handler; 
myObject.Event -= handler; 
+0

आपको ** ** ** करना है यदि आप हैंडलर को रोकना बंद करना चाहते हैं **। यदि आपको परवाह नहीं है, तो आपको यह नहीं करना है। –

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