6

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

弱引用类

在 .net 中,一些类还实现了 IDisposable 接口。调用此接口的 Dispose 方法可手动释放当前持有的任何托管或非托管资源。一个示例可能是 Bitmap 对象或类。

如果我将实现 IDisposable 的对象分配给弱引用,如果弱引用收集对象,会调用 Dispose 吗?

4

4 回答 4

8

总的来说,答案确实是否定的。

IDisposable但是,使用IDisposable 模式实现的正确实现的类(希望所有 .NET 类都这样做)。还将实现终结器,当对象被垃圾收集时调用,并且在终结器内部,它会调用Dispose. 因此,对于 的所有正确实现,将调用IDisposable该方法。Dispose

(注意:费尔南多的反例没有IDisposable正确实施)

于 2010-05-15T19:26:03.860 回答
6

GC 从不调用 Dispose。Dispose 必须由用户代码调用。

于 2010-05-15T18:25:10.483 回答
2

不,就这么简单;)

于 2010-05-15T18:21:09.007 回答
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方法。

于 2010-05-15T18:33:18.170 回答