私のクラスの多くは、以下のコードを繰り返して IDisposable を実装しています。これは、DRY (Don't Repeat Yourself) の原則に違反しているようです。基本クラスを作成することで一部の作業を回避できましたAbstractDisposable
が、それは不適切なようです/他の既存のオブジェクトを拡張する必要がある場合は機能しません (それらのオブジェクト自体が使い捨てではないと仮定します)。
別のオプションは、テンプレート/メタ言語を使用して、クラスごとにマネージド リソースとアンマネージド リソースのリストを指定し、プロジェクトをビルドするときに汎用の Dispose パターンを自動生成することですが、これまでメタ言語で遊んだことはありません /これは、このような一般的なシナリオでは極端に思えます。
public class SomeDisposableClass : IDisposable
{
IDisposable _something; //a managed resource (unique to this class / here for illustration)
/* ... loads of code unique to this class ... */
#region Dispose Pattern
private bool _disposed = false;
~SomeDisposableClass()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// Check to see if Dispose has already been called.
if (!this._disposed)
{
if (disposing)
{
// Dispose managed resources.
if (this._something!=null) this._something.Dispose(); //(unique to this class / here for illustration)
}
// Clean up any unmanaged resources
this._disposed = true;
}
}
#endregion
}
DRY 原則に違反せずに適切な Dispose パターンを実装する良い方法はありますか?