2009-08-17 19 views
22

का निपटान मैं सी # कक्षाओं और उनके deconstructor के बारे में थोड़ा उलझन में हूँ।इवेंट हैंडलर और सी # कक्षाएं विनाशक/

मैं मैं निर्माता में हो रही एक वर्ग उदाहरण में कुछ ईवेंट हैंडलर्स का उपभोग करने के लिए है:

public Foo(IFooHandler handler) 
{ 
    handler.Load += Load; 
    handler.Close += Close; 
} 

मैं जब फू वर्ग नष्ट हो जाता है कि घटना के लिए सदस्यता समाप्त करने की जरूरत है। क्या मैं IDisposable लागू करता हूं और वहां पर सदस्यता रद्द करता हूं, या एक डिकोनस्ट्रक्टर में? मुझे उन घटनाओं का उपभोग करने की ज़रूरत है, मैं इसे एक और तरीका नहीं कर सकता।

कक्षाओं में से एक के लिए, मैं एक उदाहरण बनाता हूं, प्रगति की जांच करता हूं, और फिर कक्षा का उदाहरण गुंजाइश से बाहर हो जाता है। दूसरे के लिए यह MainForm में फॉर्म बंद होने तक रहता है। सबसे पहले मैं इस बारे में चिंतित हूं क्योंकि इसमें अभी भी उस ईवेंट हैंडलर का संदर्भ हो सकता है और ठीक से नहीं जा सकता है।

मैं स्मृति को रिसाव नहीं करना चाहता हूं। कब और कैसे सदस्यता समाप्त करनी चाहिए?

उत्तर

24

इसे विनाशक में न करें, क्योंकि ईवेंट हैंडलर संलग्न होने पर इसे नहीं कहा जाएगा: जब आप बार की घटना के लिए एक हैंडलर के रूप में फू का एक उदाहरण विधि संलग्न करते हैं, तो बार का संदर्भ होगा फू, तो फू कचरा नहीं होगा, और इसके विनाशक को बुलाया नहीं जाएगा।

आप IDisposable को लागू करना चाहिए, और अपने वस्तु निपटाने स्पष्ट

public void Dispose() 
{ 
    if (handler != null) 
    { 
     handler.Load -= Load; 
     handler.Close -= Close; 
    } 
} 
+2

आह! मैंने सोचा कि हमें IDISposable लागू नहीं करना चाहिए जब तक कि हम अप्रबंधित कोड की सफाई नहीं कर रहे हैं? –

+0

अन्य कारणों से IDISposable लागू किया जा सकता है, यह अप्रबंधित संसाधनों की सफाई तक ही सीमित नहीं है ... –

+1

यदि आप आम डिस्पोजेबल पैटर्न को देखते हैं, तो प्रबंधित और अप्रबंधित संसाधनों को संभालने का एक मार्ग है। अधिकतर आपके पास केवल अप्रबंधित संसाधन और/या प्रबंधित लोग हैं। लेकिन आपके मामले में यह ठीक है कि केवल प्रबंधित संसाधनों को ही साफ किया जाना चाहिए। – Oliver

3

क्या तुमने कभी कक्षा एक एक लंबे रहते थे वर्ग और वर्ग (ते) बी अल्पकालिक हो जो कि ईवेंट की सदस्यता हो होने की समस्या का सामना करते हैं कक्षा ए के बाद आप शायद Weak Event Pattern में रुचि रखते हैं। यह एक समस्या हो सकती है जिसे आप खोज नहीं सकते हैं, जब तक कि देर से i.e. Princeton self driving car.

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