该合同.确保在终结器和Dispose方法中使用

本文关键字:方法 Dispose 确保 合同 | 更新日期: 2023-09-27 18:16:18

我在这里读到不检查对象终结器或实现Dispose方法的任何方法的不变量,但它没有说明原因。我怀疑其原因是,当对象被处置时,不变条件可能不再成立,从而可能导致终结器或处置方法失败。

如果我的推理是正确的,这是否意味着我不应该在终结器和dispose方法(或任何代码契约)中使用Contract.Ensures() ?

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

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

该合同.确保在终结器和Dispose方法中使用

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