Class 互斥条件不变

Class invariant for mutually exclusive conditions

我的 class 有两个私有字段和三个构造函数。

一个构造函数是不赋值的默认构造函数。

其余构造函数分别实例化两个字段之一,确保一个字段为alwaysnull,另一个字段为never null.

public class MyClass
{
    private readonly Foo foo;
    public Foo InstanceOfFoo { get { return this.foo; } }

    private readonly Bar bar;
    public Bar InstanceOfBar { get { return this.bar; } }

    // Default constructor: InstanceOfFoo == null & InstanceOfBar == null
    public MyClass()
    {
    }

    // Foo constructor: InstanceOfFoo != null & InstanceOfBar == null
    public MyClass(Foo foo)
    {
        Contract.Requires(foo != null);
        this.foo = foo;
    }

    // Bar constructor: InstanceOfFoo == null & InstanceOfBar != null
    public MyClass(Bar bar)
    {
        Contract.Requires(bar != null);
        this.bar = bar;
    }
}

现在我需要添加一个class不变方法,指定InstanceOfFooInstanceOfBar是互斥的:两者都可以是null,但只能是其中之一可以是 null.

以外的内容

如何用代码表达?

[ContractInvariantMethod]
private void ObjectInvariant()
{
    // How do I complete this invariant method?
    Contract.Invariant((this.InstanceOfFoo == null && this.InstanceOfBar == null) || ...);
}

看起来简单的 OR 就足够了:

Contract.Invariant(this.InstanceOfFoo == null || this.InstanceOfBar == null);

证明(对于投反对票的人:)

1. (null, null): true  || true  -> true
2. (inst, null): false || true  -> true
3. (null, inst): true  || false -> true
4. (inst, inst): false || false -> false