我对正确实现IDisposable的方式有些唠叨疑惑。请考虑以下情形......与IDisposable混淆
public class Foo : IDisposable {...}
public class Bar : IDisposable {
private bool disposed = false;
private readonly Foo MyFoo;
public Bar() {
this.MyFoo = new Foo();
}
public Bar(Foo foo) {
this.MyFoo = foo;
}
~Bar() {
Dispose(false);
}
protected virtual void Dispose(bool disposing) {
if (!this.disposed) {
if (disposing) {
if (MyFoo != null) {
this.MyFoo.Dispose();
this.MyFoo = null;
}
}
this.disposed = true;
}
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
}
我的问题是:
1)如果一个类创建了一个一次性的对象,它应该调用在自己的Dispose该对象的Dispose()方法()方法?
2)如果一个可丢弃的对象作为引用传递给一个类,那么如果该类仍然对该引用对象调用Dispose()方法,或者应该将它留给创建该对象的类的第一个类?
上述模式似乎出现了很多(特别是与DI),但我似乎无法找到正确的方式来构造这个的具体例子。
谢谢汉斯,非常有用。冒着滥用你的帮助的风险,你对在类中创建的一次性对象的处理有什么看法,而不是那些作为参考提供的对象 - 例如在类构造器中? – Neilski
这是你需要自己解决的问题。谁成为对象的“所有者”?在完成使用之前,您无法真正承担创建Foo对象的其他代码。当您使用它时,其他代码也不会知道*。所以通常的做法是转让所有权,然后处置它。例如,也由.NET框架,StreamWriter(Stream)构造函数完成。 –