合同要求使用

时间:2011-11-28 18:56:40

标签: c# design-by-contract

这是我的问题。我是契约设计的忠实粉丝,我正在使用这个概念,特别是在开发可供其他开发人员使用的库时。我刚刚找到了一种新的方式:Contract.Requires而不是Exception: 所以没有:

public void SomeMethod(string name){
   if(name==null) throw new NullArgumentException("Null values not supported");
} 

我现在有:

public void SomeMethod(string name){
   Contract.Requires(name != null);
}

编辑:我在调试模式下在VS2010下工作。

问题:即使Contract.Requiresnamenull也无法执行任何操作!

MSDN文档说:

  

指定封闭方法或的封面前提条件   属性。

但是如果条件不满足则没有指定任何内容!

我还注意到有other Contract.Requires重载会抛出异常,显示消息......但是Contract.Requires(Boolean)是什么?

编辑下面的答案强调必须安装一个插件才能拥有Contract API的全部功能,但是那些希望他们的代码在不同代码上行为相同的Mono用户呢?平台?

3 个答案:

答案 0 :(得分:25)

您应该执行以下操作:

  1. 安装代码合同加载项,因为nfechner已注明
  2. 转到项目属性“代码合同”文件夹
  3. 检查'执行运行时合同检查'
  4. 将“装配模式”切换为“标准合同要求”
  5. Contract.Requires代替您的Contract.Requires<SomeException>(第一个抛出System.Diagnostics.ContractException,而第二个抛出您指定的对公共方法很重要的异常)
  6. 这是基本设置。要获得更准确的配置,refer to the manual

    如果使用Mono,可能是Contract类为空。我没有这样做,但是合同手册中的第七章似乎解释了如何提供自己的实现。

答案 1 :(得分:11)

来自Contract class docs

  

重要

     

您必须安装Visual Studio加载项才能强制执行合同。 Code Contracts Premium Edition加载项允许您指定静态和运行时   检查项目“属性”页面上的代码合同。如果你这样做   不启用运行时检查,Contract.Ensures之类的合同   如果是合同,方法将不会在运行时抛出异常   侵犯。 Visual Studio加载项不随Visual Studio一起提供   2010或Windows SDK。

答案 2 :(得分:2)

通过这样的消息,确切地指定您所做的事情通常很有帮助。

例如,如果您已经安装了VS Addon,也没有在原始消息中提及,也没有在项目属性下启用它,或者您实际上在调试与发布模式下运行等等。

重新Contract.RequiresContract.Requires<Exception>

建议

Contract.Requires。 根据手册

  

如果您的代码必须在a失败时抛出特定异常   特殊前提条件,您可以使用通用重载表单   下面。 (在您的表格中提交此表格之前,请阅读第5.1节   码。如果不运行合同工具,则无法使用Requires < Exn <Exn>>   在所有构建上。如果这样做,每次都会出现运行时故障。)