我對正確實現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)構造函數完成。 –