2008-10-09 12 views
8

मेरे पास एक महत्वपूर्ण संसाधन के साथ एक सी # ऑब्जेक्ट है जिसे समय-समय पर बहुत विशिष्ट बिंदुओं को फ़्लश करने की आवश्यकता होती है ताकि कचरा कलेक्टर के लिए चारों ओर जाने के लिए खराब उम्मीदवार बन जाए, जब भी यह इसके आसपास हो, मुझे इसे कैसे संभालना चाहिए? क्या सी ++ के डिलीट ऑपरेटर की तरह कुछ है जो मुझे आवश्यक होने पर इस ऑब्जेक्ट के उदाहरण को मैन्युअल रूप से मारने देगा?आप सी # में निर्धारिक अंतिमकरण कैसे प्रबंधित करते हैं?

उत्तर

2

यह ठीक है IDiposable इंटरफ़ेस के लिए है। आप Dispose() विधि में महत्वपूर्ण संसाधनों को जारी करते हैं, और फिर ऑब्जेक्ट को मिटाने के साथ निपटने के लिए ऑब्जेक्ट को कचरा डिस्पोजेर के लिए छोड़ दें।

0

Google IDISposable इंटरफ़ेस के लिए Google। यह आपके लिए उपलब्ध एकमात्र तंत्र है। यदि आपका महत्वपूर्ण संसाधन अप्रबंधित है तो यह दर्जी बना है। यदि यह एक प्रबंधित संसाधन है, तो क्या आप "फ्लश" होने की आवश्यकता के बारे में अधिक विशिष्ट हो सकते हैं।

0

आईडीस्पोजेबल इंटरफेस को सी ++/सीएलआई में निर्धारित विनाश का समर्थन करने के लिए जोड़ा गया था, और आप इसे किसी भी .NET भाषा से उपयोग कर सकते हैं। यह वही है जो आप चाहते हैं।

0

यदि आप एक विशिष्ट प्रबंधित संसाधन के बारे में बात कर रहे हैं जिसे आपको "विशिष्ट" समय पर जारी किया जाना चाहिए, तो आप ऑब्जेक्ट को संदर्भित करने के बाद कचरा कलेक्टरों कलेक्ट विधि को निर्दिष्ट रूप से कॉल कर सकते हैं, लेकिन प्रदर्शन विचार हैं इस बारे में सोचा जाए, आमतौर पर कचरा कलेक्टर जानता है कि वस्तुओं को कब इकट्ठा करना है। और सामान्य रूप से यह एक बुरा विचार है।

जैसा कि अन्य ऊपर उल्लेखित कर रहे हैं, IDISposable पैटर्न आवश्यक होने पर अप्रबंधित संसाधनों को जारी करने के लिए सहायक है।

नोट: मैं दोहराने जा रहा हूं, आप जीसी कॉल कर सकते हैं। (लेकिन यह अच्छी बात नहीं है, लेकिन सवाल के लिए एक वैध जवाब है!

+1

जीसी.कोलेक्ट() को कॉल न करें। अंदर आने के लिए बुरी आदत, और आमतौर पर उपयोगी से अधिक हानिकारक है। – Will

+0

मुझे पता है कि ... इस प्रकार इसका उपयोग न करने के बारे में मेरा नोट। –

2

IDISposable इंटरफ़ेस निर्धारित विनाश के लिए मौजूद है। MSDN पर इसे सही ढंग से कार्यान्वित करने के लिए एक पैटर्न है।

टंडेम में, आपको using statement का उपयोग करने पर भी विचार करना चाहिए जब आपके ऑब्जेक्ट का जीवनकाल एकाधिक स्कॉप्स नहीं फैलता है।

20

आप IDisposable के लिए देख रहे हैं। यहां एक उदाहरण वर्ग है जो इसे लागू करता है।

class MyDisposableObject : IDisposable 
{ 
    public MyDisposableObject() 
    { 
    } 

    ~MyDisposableObject() 
    { 
     Dispose(false); 
    } 

    private bool disposed; 
    private void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
      // Dispose of your managed resources here. 
      } 

      // Dispose of your unmanaged resources here. 

      this.disposed = true; 
     } 
    } 

    void IDisposable.Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
} 

इसका इस्तेमाल करने के लिए आपको कुछ इस तरह कर सकते हैं:

public void DoingMyThing() 
{ 
    using (MyDisposableObject obj = new MyDisposableObject()) 
    { 
     // Use obj here. 
    } 
} 

using कीवर्ड यह सुनिश्चित करें कि IDisposable पर Dispose() विधि इसके दायरे के अंत में कहा जाता हो जाता है बनाता है।

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