2

Web 上のソースをクロールしているときに、次のように見える多くの定型コードに遭遇しました。

public class CustomObject: IDisposableたくさんのメソッドを持つ がいくつかあるとします。

現在、これらの各メソッドにはデフォルトのサニティ チェックがあります。

if (inputBuffer == null)
    throw new ArgumentNullException("inputBuffer");
if (outputBuffer == null)
    throw new ArgumentNullException("outputBuffer");
if (inputCount < 0)
    throw new ArgumentException("inputCount", "< 0");

ただし、(IDisposableインターフェイスの実装により) 次のチェックが各メソッドに追加されます。

if (disposed)
    throw new ObjectDisposedException("MethodName");

さて、これは一般的な慣行ですか?古い使い捨てクラスの再設計とこれらのチェックの実装を開始する必要がありますか?

4

3 に答える 3

3

さて、これは一般的な慣行ですか?

はい、お勧めです。ほぼ全メンバー対象。クラスが IDisposable で、リソースを必要とするメソッドが Dispose() の後に呼び出される場合、呼び出しコードに重大な論理エラーがあります。あなたの仕事はこれを知らせることです。

ただし、所有するリソースに決定的に依存しないメソッド (またはプロパティ) が存在する可能性があることに注意してください。これらは、Dispose() の後に安全に呼び出すことができます。たとえば、IsOpen関数/プロパティ。単純に を返すことができfalse、例外は必要ありません。

ただし、IsDisposed チェックを Dispose() 自体に入れるべきではありません。ガイドラインとして、Dispose() を複数回呼び出しても安全である必要があります。

古い使い捨てクラスの再設計とこれらのチェックの実装を開始する必要がありますか?

一般的には良い考えです。努力する価値があるかどうかはあなた次第です。

于 2011-11-24T12:32:33.417 に答える
2

追加しても害がないかどうか疑問がある場合は、使用法に依存します。

他のプログラム (ライブラリやフレームワークなど) で使用することを意図したクラスの場合、常にこのチェックを実行して正しい例外をスローします。これにより、他のアプリケーションがエラーを診断するのに役立ち、クラスがより堅牢になります。

私のアプリケーションでのみ使用されることを意図した内部クラスの場合、メソッドを呼び出すときにエラーがすぐに発生するかどうかのチェックをスキップできます。たとえば、クラス内のすべてのメソッドがストリームを使用し、そのストリームが破棄されるか null に設定された場合、すぐに例外が発生します。

ただし、内部クラスにエラーが発生しないメソッドがある場合は、オブジェクトが破棄された後も一部のメソッドがまだ機能する状況が望ましくないため、常に明示的なチェックを使用します (そのような明示的に許可するメソッドを除く)。としてIsDisposed)。

明示的なチェックを行うことには、オブジェクトが破棄された後にどのメソッドを呼び出すことが許可されているかを明示的に文書化できるという利点があります。さらに、呼び出しを行わないメソッドの先頭に、GuardDisposed許可されていることを示すコメントを追加すると、先頭にないメソッドGuardDisposedまたはコメントが疑わしいと見なされる可能性があります。

チェックを実際に実装するには、別のメソッドに移動して、アサーションのように使用することを好みます。

public class Foo
{
    private bool disposed;

    public void DoSomething ()
    {
        GuardDisposed ();
    }

    protected void GuardDisposed ()
    {
        if (disposed)
            throw new ObjectDisposedException (GetType ().Name);
    }
}
于 2011-11-24T12:35:32.450 に答える
0

Dispose() (通常は) メソッド内に配置したそのコードは、単一のインスタンスで明示的に (および/または) 明示的に複数回呼び出されないようにするためです。

そのメソッドで 1 回実行できる何か (DeleteFile、CloseTransaction など) や、アプリ ドメインで 2 回実行してはならないその他の操作を行う場合に使用します。

したがって、これが一般的な方法である場合は、アプリの要件によって異なります。

于 2011-11-24T12:18:32.510 に答える