2010-05-15 15 views
5

सी # में यह के रूप में यहाँ वर्णित वस्तुओं के लिए कमजोर संदर्भ बनाने के लिए संभव है:कमजोर संदर्भ और डिस्पोजेबल वस्तुओं

WeakReference Class

.net में कुछ कक्षाएं भी IDisposable इंटरफ़ेस को लागू। इस इंटरफेस की निपटान विधि को कॉल करना वर्तमान में किसी भी प्रबंधित या अप्रबंधित संसाधनों को मैन्युअल रूप से निपटाने के लिए किया जाता है। एक उदाहरण बिटमैप ऑब्जेक्ट या क्लास हो सकता है।

अगर मैं एक वस्तु है कि एक कमजोर संदर्भ के लिए IDisposable लागू करता असाइन करते हैं, कमजोर संदर्भ वस्तु जमा करता है, तो कहा जा निपटान होगा? ऐसे ही

+2

आप "WeakReference" अपनी वस्तुओं को इकट्ठा करके क्या मतलब है? यह सिर्फ एक कमजोर संदर्भ है, यानी जिस वस्तु को इंगित किया जा रहा है वह कचरा कलेक्टर द्वारा एकत्र किया जा सकता है। इस मामले में सभी को आप जानते कचरा कलेक्टर लागू होता है के बारे में ... – flq

+0

जैसा फ्रैंक ने कहा कि वस्तु सिर्फ कचरा कलेक्टर द्वारा एकत्र किया जाएगा। यदि आपके पास ऐसा है तो यह बदले में फाइनलज़र को ट्रिगर करेगा। हालांकि निपटान विधि कभी ट्रिगर नहीं की जाएगी। – Steffen

उत्तर

5

सामान्य में, इस सवाल का जवाब वास्तव में नहीं।

हालांकि, एक ठीक से लागू वर्ग कि IDisposable लागू करता IDisposable pattern (hopefuly सभी .NET कक्षाएं ऐसा करने) का उपयोग कर रहा है। भी finalizer जो जब वस्तु कचरा एकत्र और finalizer के अंदर है कहा जाता है को लागू करेंगे, यह Dispose कहेंगे। तो, IDisposable के सभी उचित कार्यान्वयन के लिए, Dispose विधि बुलाया जाएगा।

(नोट: जवाबी उदाहरण फर्नांडो द्वारा IDisposable को लागू नहीं किया गया है ठीक से)

+2

वास्तव में, "मानक" finalizer केवल 'निपटान (bool) कहता है'; 'निपटान()' नहीं बुलाया जाता है, इसलिए किसी भी सफाई है कि प्रबंधित कोड पर निर्भर करता है (उदाहरण के लिए, अंतर्निहित फ़ाइल धाराओं निस्तब्धता) नहीं किया जा सकता। –

5

जीसी कभी निपटान फोन नहीं करता है। निपटान उपयोगकर्ता कोड द्वारा बुलाया जाना चाहिए।

+1

[आरएक्स लाइब्रेरी] (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) से 'रेफकाउंट डिस्पोजेबल' के साथ 'वीक रेफरेंस' को बदलकर आपके डिज़ाइन को बेहतर ढंग से सेवा दी जा सकती है। –

1

सं चेक इस परीक्षण:

class Program { 
     static void Main(string[] args) { 
      Test test = new Test(); 
      Console.WriteLine(test.Disposable == null); 
      GC.Collect(); 
      Console.WriteLine(test.Disposable == null); 
      Console.ReadLine(); 
     } 
    } 

    public class Test { 
     private WeakReference disposable = new WeakReference(new WeakDisposable()); 
     public WeakDisposable Disposable { 
      get { return disposable.Target as WeakDisposable; } 
     } 
    } 

    public class WeakDisposable : IDisposable { 
     ~WeakDisposable() { 
      Console.WriteLine("Destructor"); 
     } 
     public void Dispose() { 
      Console.WriteLine("Dispose"); 
     } 
    } 

उत्पादन होता है:

False 
True 
Destructor 

आप देख सकते हैं, निष्पादन कभी नहीं Dispose विधि पूरी करता है।

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