Contract.Ensures应该用于终结器和Dispose方法吗?

时间:2013-05-31 09:52:09

标签: c# code-contracts

我读过here,不检查对象终结符或实现Dispose方法的任何方法的不变量,但它没有说明原因。我怀疑原因是当处理对象时,不变条件可能不再成立,因此可能使终结器或处理方法失败。

如果我的推理是正确的,那是否意味着我不应该在终结器中使用Contract.Ensures()并处理方法(或者任何代码合同)?

我的具体示例是使用Contract.Ensures()确保退出IsDisposed方法时true属性为Dispose()

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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以而且应该在Dispose和finalizer方法中使用Ensures。这些适用于您的代码。不应用不变量,因为正如你所说,终结器/ Dispose方法经常使对象无效,不再满足对象不变量。