例如,有一个类:
public class MyClass{
Bitmap bmp;
}
Bitmap类是一次性的。
如果我没有在MyClass中实现IDisposable并且没有对MyClass实例的引用,则意味着没有对Bitmap类实例的引用,因此GarbageCollector将调用Bitmap的终结器,所有非托管资源将被释放。
为什么代码分析器建议在MyClass中实现IDisposable?
答案 0 :(得分:4)
也许会。但当?这个类不能可靠地使用。如果我按顺序创建10.000,那么10.000未处理的位图将在内存中,等待惰性垃圾收集器调用终结器(希望)调用Dispose
。可能是今天。明天吧。但作为一名开发人员,我无法控制这一点。如果您正确实施IDisposable
,我可以在每个using
周围设置一个Bitmap
块,我将永远不会使用比单{{1}}更多的资源。
答案 1 :(得分:1)
实施IDispose有两个原因:
1.处理非托管资源 - 这是关于清理什么(非托管资源)
2.能够控制何时释放托管资源 - 这是关于清理事项的时间。
IDisposable文档非常重视1.但实际上大多数意义都是关于2.
在您的示例中就是这种情况 - 您管理的资源(由管理的Bitmap类包装非托管位图句柄)。您可以将它放置在您的配置中,以使您的类的用户能够控制何时释放位图(不是如果它被释放 - 最终,当GC感觉像它时)。