我的班级有两个私人领域和三个建设者。
一个构造函数是默认构造函数,不指定任何值。
其余的构造函数每个实例化两个字段中的一个,确保一个字段始终 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;
}
}
现在我需要添加一个类不变方法,指定InstanceOfFoo
和InstanceOfBar
是互斥的:两者都可以是null
,但只有一个可以是null
之外的其他内容{1}}。
我如何在代码中表达它?
[ContractInvariantMethod]
private void ObjectInvariant()
{
// How do I complete this invariant method?
Contract.Invariant((this.InstanceOfFoo == null && this.InstanceOfBar == null) || ...);
}
答案 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