1

ここで、オブジェクトのファイナライザーや Dispose メソッドを実装するメソッドに対して不変条件がチェックされていないことを読みましたが、その理由は述べられていません。その理由は、オブジェクトが破棄されているときに不変条件が成り立たなくなり、ファイナライザーまたは破棄メソッドが失敗する可能性があるためだと思います。

私の推論が正しい場合、それはファイナライザーで使用してメソッドを破棄するべきではないことを意味しますContract.Ensures() か (またはその問題に関するコード契約)?

私の具体的な例は、プロパティがメソッドの終了時にあるContract.Ensures()ことを確認するために使用しています。IsDisposedtrueDispose()

public class ExampleClass : IDisposable
{
    public bool IsDisposed { get; set; }

    ~SomeClass()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Contract.Ensures(IsDisposed);
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        Contract.Ensures(IsDisposed);
        if (!IsDisposed)
        {
            if (disposing)
            {
                // Other code here
            }
            IsDisposed = true;
        }
    }
}
4

1 に答える 1

1

Dispose メソッドとファイナライザー メソッドでは、Ensures を使用できますし、使用する必要があります。これらはコードに適用されます。あなたが言うように、ファイナライザー/Disposeメソッドは、オブジェクトの不変条件を満たさなくなる方法でオブジェクトを無効にすることが多いため、不変条件は適用されません。

于 2013-06-06T22:30:53.710 に答える