考虑以下代码:
namespace DisposeTest { using System; class Program { static void Main(string[] args) { Console.WriteLine("Calling Test"); Test(); Console.WriteLine("Call to Test done"); } static void Test() { DisposeImplementation di = new DisposeImplementation(); } } internal class DisposeImplementation : IDisposable { ~DisposeImplementation() { Console.WriteLine("~ in DisposeImplementation instance called"); } public void Dispose() { Console.WriteLine("Dispose in DisposeImplementation instance called"); } } }
即使在Test();调用之后放置了一个等待循环,也永远不会调用Dispose 。真是太烂了。我想编写一个简单易用的类,以确保清除所有可能的资源。我不想把这种责任交给班上的用户。
Test();
可能的解决方案:使用using,或致电“自行处理”(基本相同)。我可以强迫用户使用using吗?还是我可以强迫处置被称为?
using
GC.Collect();之后调用Test();也不起作用。
GC.Collect();
把di以null不调用任何处置。解构函数可以正常工作,因此对象get在退出时被解构Test()
di
null
Test()
大家好,现在很清楚!
谢谢大家的答案!我将在评论中添加警告!
我想编写一个简单易用的类,以确保清除所有可能的资源。我不想把这种责任交给班上的用户。
你不能那样做。内存管理根本不是为了容纳不是专门用于内存的资源而构建的。
IDisposable模式供开发人员使用,它是在对象完成操作时告诉对象的一种方式,而不是让内存管理人员通过使用引用计数之类的方法来弄清楚这一点。
对于无法正确处理对象的用户,可以使用Finalizer作为后备,但它不能作为清理对象的主要方法。为使工作顺利进行,应正确放置对象,这样就不必调用成本更高的Finalizer。