簡體   English   中英

弱引用和一次性對象

[英]Weak References and Disposable objects

在C#中,可以創建對象的弱引用,如下所述:

WeakReference類

在.net中,一些類還實現了IDisposable接口。 調用此接口的Dispose方法以手動處理當前保留的任何托管或非托管資源。 一個例子可能是Bitmap對象或類。

如果我將一個實現IDisposable的對象分配給弱引用,如果弱引用收集對象,是否會調用Dispose?

GC不會調用Dispose。 必須通過用戶代碼調用Dispose。

一般來說,答案確實是否定的。

但是,正確實現的類使用IDisposable模式實現IDisposable (希望所有.NET類都這樣做)。 還將實現在對象被垃圾收集時調用的終結器,並且在終結器內部,它將調用Dispose 因此,對於IDisposable所有正確實現,將調用Dispose方法。

(注意:Fernando的反例沒有正確實現IDisposable

不,很簡單;)

不。檢查此測試:

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方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM