互斥条件的类不变量

时间:2015-02-08 10:58:19

标签: c# .net code-contracts

我的班级有两个私人领域和三个建设者。

一个构造函数是默认构造函数,不指定任何值。

其余的构造函数每个实例化两个字段中的一个,确保一个字段始终 null而另一个字段从不 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;
    }
}

现在我需要添加一个类不变方法,指定InstanceOfFooInstanceOfBar是互斥的:两者都可以是null,但只有一个可以是null之外的其他内容{1}}。

我如何在代码中表达它?

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

1 个答案:

答案 0 :(得分:1)

看起来简单的OR应该是enougth:

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