2010-05-15 63 views
5

在C#中,可以如下描述创建对象的弱引用:弱引用和一次性物品

WeakReference Class

在.NET中一些类也实现IDisposable接口。调用此接口的Dispose方法是为了手动处理当前保存的任何托管或非托管资源。一个例子可能是一个Bitmap对象或类。

如果我给你的是实现IDisposable到弱引用的对象,如果将弱引用收集对象Dispose已被叫什么名字?

+2

你是什么意思“WeakReference的”收集它的对象是什么意思?它只是一个弱引用,即它指向的对象可能被垃圾收集器收集。在这种情况下,所有你知道的垃圾收集器适用... – flq 2010-05-15 18:21:18

+0

就像弗兰克说的对象将只被垃圾收集器收集。这反过来会触发终结者,如果你有这样一个。 虽然Dispose方法永远不会被触发。 – Steffen 2010-05-15 18:24:03

回答

5

一般来说,答案是的确号

然而,正确实现类,使用IDisposable pattern(hopefuly所有.NET类做到这一点)实现IDisposable。也将执行终结被称为当对象被垃圾收集和终结里面,它会调用Dispose。因此,对于IDisposable所有适当的实施中,Dispose方法将被调用。

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

+2

其实, “标准” 的终结只是调用'的Dispose(布尔)'; '的Dispose()'不叫,以便依赖于托管代码任何清除(例如,潮红底层文件流)无法做到的。 – 2010-05-18 23:12:49

5

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

+1

从[Rx库](http://msdn.microsoft.com/zh-cn/devlabs/ee794896.aspx)将'WeakReference'替换为'RefCountDisposable',可以更好地实现您的设计。 – 2010-05-15 18:27:30

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