【发布时间】:2014-09-29 10:33:53
【问题描述】:
在哪里为对象拥有的IDisposable 对象调用Dispose()?
public class MyClass
{
public MyClass()
{
log = new EventLog { Source = "MyLogSource", Log = "MyLog" };
FileStream stream = File.Open("MyFile.txt", FileMode.OpenOrCreate);
}
private readonly EventLog log;
private readonly FileStream stream;
// Other members, using the fields above
}
我应该为这个例子实现Finalize() 吗?如果我什么都不做怎么办?会不会有什么问题?
我的第一个想法是MyClass 应该实现IDisposable。但是an MSDN article中的以下声明让我感到困惑:
仅当您直接使用非托管资源时才实施 IDisposable。如果您的应用程序仅使用实现 IDisposable,不要提供 IDisposable 实现。
这个说法有错吗?
【问题讨论】:
-
累积。对于您的 MSDN 更新,您 正在 直接使用非托管资源。您通过将它们作为字段来拥有它们,因此您有责任处置它们。如果只使用它们(例如,作为对象传递给方法),则不应实现
IDisposable。 -
我同意 MSDN 的引用具有误导性。它谈论“您的应用程序”和“应用程序”(无论是什么)都无法实现 IDisposable。只有类可以。
-
@TimSchmelter:代码没有直接使用非托管资源;它正在获取和使用托管资源[托管资源包装器,理论上将被清理,最终,如果被放弃],这反过来又持有非托管资源。微软围绕资源的术语相当草率。
标签: c# .net dispose idisposable