管理されていないリソースを破棄するための「標準の完全な」IDisposable
実装に関する情報はたくさんありますが、実際には、このケースは (非常に) まれです (ほとんどのリソースは既に管理クラスによってラップされています)。この質問は、より一般的な「マネージド リソースのみ」の場合の IDisposable の最小限の実装に焦点を当てています。
IDisposable
1:以下のコード の最小限の実装は正しいですか? 問題はありますか?
2:提示された最小限の 実装に完全な標準IDisposable
実装 ( Dispose()
、Dispose(bool)
など)を追加する理由はありますか?Finalizer
Dispose
3: この最小限のケースで仮想化するのは賢明ですか? (提供していないためDispose(bool)
)?
4: この最小限の実装が、(この場合は役に立たない) ファイナライザーを含む完全な標準実装に置き換えられた場合、GC がオブジェクトを処理する方法が変わりますか? 欠点はありますか?
5: 例にはおよび イベント ハンドラーが含まれています。これらのケースは特に重要です。これらのケースを破棄しないと、GC がそれらを破棄するまで、Timer
オブジェクトを生きたままにしておくことができます (this
の場合Timer
、イベント ハンドラーの場合)。eventSource
時間です。このような例は他にありますか?
class A : IDisposable {
private Timer timer;
public A(MyEventSource eventSource) {
eventSource += Handler
}
private void Handler(object source, EventArgs args) { ... }
public virtual void Dispose() {
timer.Dispose();
if (eventSource != null)
eventSource -= Handler;
}
}
class B : A, IDisposable {
private TcpClient tpcClient;
public override void Dispose() {
(tcpClient as IDispose).Dispose();
base.Dispose();
}
}
refs:
MSDN
SO: 管理対象リソースをいつ管理する必要がある
か SO: C# の Dispose() メソッドで管理対象リソースを破棄する方法
SO: 管理対象リソースをクリーンアップするための Dispose()