在 C# 中,可以创建对对象的弱引用,如下所述:
在 .net 中,一些类还实现了 IDisposable 接口。调用此接口的 Dispose 方法可手动释放当前持有的任何托管或非托管资源。一个示例可能是 Bitmap 对象或类。
如果我将实现 IDisposable 的对象分配给弱引用,如果弱引用收集对象,会调用 Dispose 吗?
在 C# 中,可以创建对对象的弱引用,如下所述:
在 .net 中,一些类还实现了 IDisposable 接口。调用此接口的 Dispose 方法可手动释放当前持有的任何托管或非托管资源。一个示例可能是 Bitmap 对象或类。
如果我将实现 IDisposable 的对象分配给弱引用,如果弱引用收集对象,会调用 Dispose 吗?
总的来说,答案确实是否定的。
IDisposable
但是,使用IDisposable 模式实现的正确实现的类(希望所有 .NET 类都这样做)。还将实现终结器,当对象被垃圾收集时调用,并且在终结器内部,它会调用Dispose
. 因此,对于 的所有正确实现,将调用IDisposable
该方法。Dispose
(注意:费尔南多的反例没有IDisposable
正确实施)
GC 从不调用 Dispose。Dispose 必须由用户代码调用。
不,就这么简单;)
不。检查这个测试:
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
方法。