繁体   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