代码与自动实现的属性签订合同
有没有办法将合同放在.NET中自动实现的属性上? (如果答案是’是’怎么办?)?
(我假设使用DevLabs的.NET代码合同)
是的,这是可能的 – 所需要的只是将您的合同条件添加到类中的[ContractInvariantMethod]
方法,然后将等效的Requires
前置条件添加到自动set
,并将后置条件Ensures
添加到get
。 参考文献第2.3.1节
如示例所示,自动属性的不变量变为:
- 设定者的前提条件
- 吸气剂的后置条件
- 底层支持字段的不变量
并举例说明:
public int MyProperty { get; private set ;} [ContractInvariantMethod] private void ObjectInvariant () { Contract.Invariant ( this.MyProperty >= 0 ); }
“相当于以下代码:”
private int backingFieldForMyProperty; public int MyProperty { get { Contract.Ensures(Contract.Result() >= 0); return this.backingFieldForMyProperty; } private set { Contract.Requires(value >= 0); this.backingFieldForMyProperty = value; } } [ContractInvariantMethod] private void ObjectInvariant () { Contract.Invariant ( this.backingFieldForMyProperty >= 0 ); ...
我想不是,但你可以轻松编写一个可以做到这一点的片段。 如果你走这条路, 这里有一个免费的代码片段编辑器 ,可以很容易地完成任务。
谢谢Porges。
我的错误是我实际上使用了ReleaseRequires
选项,它实际上只处理方法的generics版本, Requires
。
放在自动实现的属性上的不变量实际上变成了一个 Requires
前置条件,但它不是通用的 – 这就是为什么它不能使用这个选项。
该怎么办:
-
VARIANT 1.考虑使用代码片段和可爱的
Requires
而不是自动实现的属性 – 这使我们能够使用所需类型的exception。 -
VARIANT 2. 将选项
ReleaseRequires
更改为 Code Contracts选项中的Preconditions
,并随意在自动属性上写入不变量 – 重写器工具会自动将它们更改为Requires
。 但是,它们将是非generics的 – 这意味着,如果合同中断,将抛出ContractException
并且无法更改此行为。
谢谢大家的帮助!