在C#中,可以创建对象的弱引用,如下所述:
在.net中,一些类也实现了IDisposable接口。调用此接口的Dispose方法以手动处理当前保留的任何托管或非托管资源。一个例子可能是Bitmap对象或类。
如果我将一个实现IDisposable的对象分配给弱引用,如果弱引用收集对象,是否会调用Dispose?
答案 0 :(得分:5)
GC不会调用Dispose。必须通过用户代码调用Dispose。
答案 1 :(得分:5)
一般来说,答案确实是否。
但是,正确实现的类使用IDisposable pattern实现IDisposable
(希望所有.NET类都这样做)。还将实现在对象被垃圾收集时调用的终结器,并且在终结器内部,它将调用Dispose
。因此,对于IDisposable
的所有正确实现,将调用Dispose
方法。
(注意:费尔南多的反例未正确实施IDisposable
)
答案 2 :(得分:2)
没有。很简单;)
答案 3 :(得分: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
方法。