1

我在这里读到,不检查对象终结器或实现 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;
        }
    }
}
4

1 回答 1

1

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

于 2013-06-06T22:30:53.710 回答