对IDisposable使用不变量

Lib*_*bor 6 c# code-contracts

考虑以下IDisposable课程:

class MyClass : IDisposable
{
    public bool IsDisposed { get; private set; } = false;

    public void Dispose()
    {
        IsDisposed = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类中的每个方法,包括Dispose(),应该以这样的检查开头:

if (IsDisposed)
{
    throw new ObjectDisposedException(...);
}
Run Code Online (Sandbox Code Playgroud)

由于在所有方法中写这个都很乏味和重复,我想使用契约不变量:

public class MyClass : IDisposable
{
    ...

    [ContractInvariantMethod]
    private void objectInvariant()
    {
        Contract.Invariant(!IsDisposed)
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,这只能确保IsDisposed 每个公共方法的末尾都是false ,不包括Dispose().

一旦Dispose()被调用,检查应该在每个方法的开头(包括Dispose())完成.否则,在方法运行期间,obejct将处于无效状态,可能导致困难的错误.

因此,契约不变量并不真正可用IDisposable.或者我错过了什么?

是否有可能强制invaraiants也被用作前提条件,还是我真的必须!IsDisposed手动为所有方法写相同的前提条件()?

Dan*_*rth 4

您似乎误解了不变量。从文档中:

对象不变量是指只要该对象对客户端可见,该条件对于类的每个实例都应该为真。

(强调我的)在您调用 后,您的对象很可能对客户端可见Dispose,从而使该对象“无效”。但它实际上是您的对象具有的有效状态IsDisposed == true

您确实在寻找先决条件。