xyz*_*xyz 5 .net c# garbage-collection idisposable finalizer
我正在努力确保我的理解IDisposable是正确的,并且我仍然不太确定.
IDisposable 似乎有两个目的.
我的困惑来自于确定哪些场景具有"非托管资源".
假设您使用的是Microsoft提供的IDisposable实现(托管)类(例如,数据库或套接字相关).
IDisposable仅仅在1或1和2以上实现?wom*_*omp 10
- 你怎么知道它是否只为上面的1或1和2实现IDisposable?
你的第一个问题的答案是"你不应该知道".如果你正在使用第三方代码,那么你在某种程度上是它的怜悯 - 当你在它上面调用Dispose时,你必须相信它正确处理它自己.如果您不确定或者您认为存在错误,您可以尝试使用Reflector()来反汇编它(如果可能的话)并查看它正在做什么.
- 我是否有责任确保释放内部可能或不可能的非托管资源?我应该在我自己的类中添加一个终结器(这是正确的机制吗?),调用instanceOfMsSuppliedClass.Dispose()?
如果你使用.Net 2.0或更高版本,你应该很少(如果有的话)需要为你的类实现终结器.终结器为您的类增加了开销,并且通常只提供实现Dispose所需的功能.我强烈建议您访问这篇文章,以便对正确处置有一个很好的概述.在您的情况下,您可能希望调用instanceofMSSuppliedClass.Dispose()自己的Dispose()方法.
最终,在对象上调用Dispose()是一种很好的做法,因为它明确地让GC知道你已完成资源并允许用户立即清理它,并通过让其他程序员知道来间接记录代码该对象是在该点完成资源的.但即使您忘记明确地调用它,最终也会在对象无根时发生(毕竟.Net是托管平台).只有当您的对象具有需要隐式清理的非托管资源时才应该实现终结器(即,消费者有可能忘记清理它,并且这将是有问题的).
你应该总是在实现IDisposable的对象上调用Dispose(除非他们明确告诉你'这是一个有用的约定,比如ASP.NET MVC的HtmlHelper.BeginForm).您可以使用"using"语句来简化这一过程.如果您将类中IDisposable的引用挂起作为成员字段,那么您应该使用Disposable Pattern实现IDisposable 来清理这些成员.如果您运行像FxCop这样的静态分析工具,它会告诉您相同的信息.
你不应该试图猜测界面.今天该类可能不会使用非托管资源,但下一个版本呢?
| 归档时间: |
|
| 查看次数: |
1915 次 |
| 最近记录: |