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不变方法,指定InstanceOfFoo
和InstanceOfBar
是互斥的:两者都可以是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
我的 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不变方法,指定InstanceOfFoo
和InstanceOfBar
是互斥的:两者都可以是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