45

这是我的问题。我是合同设计的忠实拥护者,我正在使用这个概念,尤其是在开发可供其他开发人员使用的库时。我刚刚发现了一种新的方法,那就是: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.Requires什么都不做,即使namenull

MSDN文档说:

指定封闭方法或属性的前置条件协定。

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

我还注意到还有其他 Contract.Requires重载会引发异常、显示消息……但那是Contract.Requires(Boolean)为了什么?

下面的编辑答案强调必须安装插件才能拥有ContractAPI 的全部功能,但是希望他们的代码在不同平台上表现相同的 Mono 用户呢?

4

3 回答 3

26

您应该执行以下操作:

  1. 按照 nfechner 的说明安装 Code Contracts 插件
  2. 转到项目属性,“代码合同”文件夹
  3. 检查“执行运行时合同检查”
  4. 将“组装模式”切换为“标准合同要求”
  5. 替换你Contract.RequiresContract.Requires<SomeException>(第一个抛出System.Diagnostics.ContractException,而第二个抛出你指定的异常,这对公共方法很重要)

这就是基本设置。更准确的配置请参考手册

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

于 2011-11-28T19:19:44.013 回答
11

合同类文档

重要的

您必须安装 Visual Studio 加载项才能强制执行合同。Code Contracts Premium Edition加载项允许您在项目属性页面上指定代码合同的静态和运行时检查。如果您不启用运行时检查,则 Contract.Ensures 等合约 在违反合约的情况下不会在运行时抛出异常。Visual Studio 加载项不随 Visual Studio 2010 或 Windows SDK 一起提供。

于 2011-11-28T19:01:53.007 回答
2

使用这样的消息通常有助于准确说明您所做的事情。

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

回复Contract.RequiresvsContract.Requires<Exception>

Contract.Requires被推荐。根据说明书

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

于 2011-11-28T19:16:36.950 回答