フレームワーク自体が何らかの指標である場合、インターフェースを実装することの適切IDisposable
性は、インターフェースが定義する契約を満たすために破棄可能性が必要なプロパティであるかどうかによって異なります。IDisposable
以下を含む、少数のフレームワーク インターフェイスが を実装しています。
System.Collections.Generic.IEnumerator<T>
System.Deployment.Internal.Isolation.Store
System.Resources.IResourceReader
System.Resources.IResourceWriter
System.Security.Cryptography.ICryptoTransform
System.ComponentModel.IComponent
System.ComponentModel.IContainer
その性質上、これらのインターフェイスは通常、リソースを消費するため、リソースを解放する必要があるコンストラクトを定義します。その意味で、リソースの破棄は、インターフェイスを実装する具体的なクラスの実装の詳細ではなく、実装契約の不可欠な部分と見なすことができます。たとえば、IResourceReader
意志はリソースから読み取り、リソースを閉じることは実装契約の必要な部分です。
対照的に、具体的なクラスがIDisposable
(別のインターフェイスを介さずに) 直接実装されるフレームワークでは非常に一般的です。フレームワーク クラスの場合、これはリフレクションを通じてクエリできます。
foreach (var v in typeof(/*any type*/)
.Assembly.GetTypes()
.Where(a => a.IsClass
&& typeof(IDisposable).IsAssignableFrom(a)
&& a.GetInterfaces().Where(
i=>i!=typeof(IDisposable)
).All(i=>!typeof(IDisposable).IsAssignableFrom(i))))
{
foreach (var s in v.GetInterfaces())
Console.WriteLine(v.FullName + ":" + s.Name);
}
一般に、これらは、インターフェイス コントラクトの実行に付随して、実装にリソースの消費が必要なクラスです。たとえば、and を個別にSystem.Data.SqlClient.SqlDataAdapter
実装します。が処分を必要としないことは十分に可能ですが、 の実装にはリソースの消費と解放が必要です。IDbDataAdapter
IDisposable
IDbDataAdapter
SqlDataAdapter
あなたの場合、あなたのインターフェースを実装する2つのクラスがあることを示しています.1つは実装する必要があり、もう1IDisposable
つは実装しません。そうでない場合、リソースを破棄する機能は、定義上、インターフェイスの要件を満たすために不可欠ではありません。したがって、インターフェイス自体は実装すべきではありませんIDisposable
。
ちなみに、Dispose()
例外をスローすべきではありません ( CA1065: 予期しない場所で例外を発生させない を参照してください) IDisposable
。すべてのリソースが解放される事後条件が満たされます。を投げる必要はありませんNotSupportedException
。
補遺
考えられる 2 番目の考慮事項は、予想されるインターフェイスの使用法です。たとえば、データベース シナリオでは次のパターンを使用するのが一般的です。
System.Data.IDbCommand cmd = ...;
using (var rdr = cmd.ExecuteReader()) // returns IDataReader (IDisposable)
{
while (rdr.Read()) {...}
} // dispose
IDataReader
を実装しない場合IDisposable
、同等のコードはかなり複雑になる必要があります。
System.Data.IDbCommand cmd = ...;
System.Data.IDataReader rdr;
try
{
rdr = cmd.ExecuteReader();
while (rdr.Read()) {...};
} finally {
if (rdr is IDisposable) ((IDisposable)rdr).Dispose();
}
このタイプの使用法が一般的であると予想されるIDisposable
場合、すべての実装でIDisposable
.