たこぜりー研究室

大腸菌DNAは4.64Mbp。酵母は13Mbpで、ヒトは3Gbp

スポンサーサイト

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

Dispose pattern

#362
[.NET 2.0][C#]
FxCop で時々混乱するので、メモ。

CA1063: Microsoft.Design.ImplementIDisposableCorrectly

Dispose メソッド名のカスタマイズ」とかやると、↑の例外でひっかかるんだよぅ。
Dispose() を private にしても、明示的な実装にしても、CA1063 発生(別に CA1063 を盲信するわけではないが)。
Close() と Dispose() で中身は一緒なのだが。
結局、悪あがきで EditorBrowsable 属性をセット。

以下、.NET Reflector を用いてクラスライブラリ中の IDisposable の使用具合を整理。

1. System.Xml.XmlWriter の場合。

抽象クラスである XmlWriter では、Close() メソッドは abstract になっている。
IDisposable は明示的に実装されており、Dispose(true) を呼び出す。で protected virtual void Dispose(bool) では、try...catch の中で Close() を呼び出す。

1-1. System.Xml.XmlTextWriter の場合。

単純に Close() を実装し、内部の TextWriter に対し、Close() を実行。

2. System.Data.Common.DbDataReader の場合。

こいつも抽象クラスなので、Close() は abstract 。
だが、IDispoable.Dispose() は暗黙的に実装されており、Dispose(true) を実行する。しかも、このメソッドには EditorBrowsale 属性があり、EditorBrowsable.Never となっている。
で、Dispose(bool) はもちろん protected virtual で、diposing = true で Close() を実行。

3. System.Resources.ResourceWriter の場合。

ここでは Close() も Dispose() も public に実装されている。両方とも Dispose(true) を実行。
クラスがシールされているためか、Dispose(bool) は private になっている。

4. System.Resources.ResXResourceWriter の場合。

こっちでも Close() と Dispose() が public に実装されているのは同じ。
だが、Close() は Dispose() を呼び出し、その Dispose() では Dispose(true) と GC.SuppressFinalize(this) を呼び出す。

コメント


コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURL:  http://takojelly.blog2.fc2.com/tb.php/362-4e78f40c
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。