スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

Disposableな基底クラス

IDisposableインターフェイスを実装するとき、Diposeメソッドだけを実装すれば良いなんて思ってた時期もありました。
Dispose Finalizeパターン
Dispose Finalizeパターンを実装するクラスのテンプレート
Diposeするにもいろいろあるんだなと。WPF4だと、各コントロールはIDisposableを実装していない。でも、自分が作るクラスで、イベントなんかを実装するなら、(特にMVVMパターンを使うとその頻度が高い)、どこかで破棄をしないとメモリリークの元になってしまう。結局、IDisposableインターフェイスにお世話になる。
上記を参考に、基底クラスを作ってみた。とわいえ、ほぼ"まんま"だけど。
namespace TawamureDays.Containers {

/// <summary>
/// Dipose可能なオブジェクトの基底クラス
/// </summary>
[Serializable]
[DataContract(Namespace="TawamureDays.Containers")]
public abstract class DisposableObject : IDisposable {

#region コンストラクタ/デストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public DisposableObject() {
}

/// <summary>
/// デストラクタ
/// </summary>
~DisposableObject() {
try {
this.OnDispose(false);

} catch (Exception) {
}
}

#endregion

#region IDisposable メンバー

/// <summary>
/// 内部リソースを解放します。
/// </summary>
public void Dispose() {
try {
this.OnDispose(true);

} catch (Exception) {
}

GC.SuppressFinalize(this);
return;
}

/// <summary>
/// 解放処理済かどうかを取得します。
/// </summary>
[System.Xml.Serialization.XmlIgnore]
[DataMember(IsRequired=false)]

public bool IsDisposed {
get; private set;
}

/// <summary>
/// 内部リソースを解放します。
/// </summary>
/// <param name="disposing">false:アンマネージリソースのみ解放します。</param>
protected virtual void OnDispose(bool disposing) {
if (this.IsDisposed) {
return;
}

this.IsDisposed = true;
return;
}

#endregion
}
}

・ファイルに出力できるように、SerializableとDataContract属性をつけている。
・IsDisposedプロパティをシリアライズ対象外にする(やっても意味ないし)。
・Diposeメソッド内で、発生する例外をそれ以上伝播しないようにしている。
ただし、本来はエラーログを残すべき。
「お決まりのコード」というものを出来るだけ抽出・汎用化すれば、開発効率もちょっとは上がる。
特定の基底クラスを継承する必要がなければ、これを使うというのもありかな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。