0

IDisposable インターフェイスを実装しているときは、.in にあるbool disposed変数を操作しましたprotected virtual void Dispose(bool disposing)

しかし、単純な変数ではなく、このような状況で C# のプロパティを使用するとどうなるでしょうか。

class A : IDisposable
{
    bool disposed { get; set; }
...

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                //dispose managed ressources
            }
        }

        disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
4

2 に答える 2

2

このプロパティ:

bool disposed { get; set; }

フィールドとほぼ同じです。それは事実上これです:

bool _disposed;
bool disposed { get { return _disposed; } set { _disposed = value; } }

フィールドとプロパティの両方がプライベートであり、プロパティに動作を追加していないことを考えると、単純なフィールドに固執します。

Disposing(bool)また、クラスを封印できる場合 (サブクラスがオーバーライドしようとすることを心配する必要がないため、Dispose(bool)メソッドを完全に削除Dispose()し、単純な方法で実装するだけでよいことに注意してください。

実際、インスタンスが破棄されたかどうかを示すフラグを保持する必要がない限り、それも削除できます。

于 2013-09-24T14:34:58.147 に答える
0

disposedフラグについて話しているのか、disposingパラメータについて話しているのかは不明です。前者の場合、私の好みのパターンは、private int変数を使用し、IDisposable.Dispose実装のフラグを 1 にして、それが以前にゼロだった場合はInterlocked.Exchange呼び出すことです。Dispose(bool)読み取り専用protectedまたはpublicプロパティDisposedは、フラグが設定されているかどうかを示す必要があります。

disposingパラメータに関しては、メソッドDispose(bool)は通常、値を指定してのみ呼び出す必要がありtrueます。フラグの効果的な目的は、署名を から変更してDispose()、同じ名前を使用できるようにすることです。継承可能なクラスは、一般に、目的全体がファイナライズに集中している場合 (たとえばSafeHandle) にのみファイナライザーを持つ必要があるため、 の処理について心配する必要はありませんDispose(false)

仮想メソッドを呼び出す前に二重呼び出しをブロックしない場合、保護する必要があるすべての派生クラスは、その目的のために独自の冗長フラグを定義する必要があることに注意してください。これはやや無駄です。

于 2013-09-24T19:41:56.397 に答える