合同.需要使用

本文关键字:合同 | 更新日期: 2023-09-27 18:16:04

我的问题是。我是契约式设计的忠实粉丝,我在开发可供其他开发人员使用的库时尤其使用这个概念。我刚刚发现了一种新的方法,用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);
}

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

问题:Contract.Requires不做任何事情,即使namenull !

MSDN文档说:

为封闭方法或指定一个先决条件契约财产。

但是在不满足条件的情况下不指定任何内容!

我还注意到有其他Contract.Requires重载抛出异常,显示消息…那么Contract.Requires(Boolean)是干什么用的呢?

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

合同.需要使用

你应该这样做:

  1. 安装Code Contracts插件
  2. 进入项目属性,'Code Contracts'文件夹
  3. 检查"执行运行时合同检查"
  4. 将"组装模式"切换为"标准合同要求"
  5. Contract.Requires替换为Contract.Requires<SomeException>(第一个抛出System.Diagnostics.ContractException,而第二个抛出您指定的异常,这对公共方法很重要)

这是基本设置。要获得更准确的配置,请参阅手册

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

来自Contract类文档:

重要的

必须安装Visual Studio外接程序来执行契约。的代码合约高级版外接程序允许您指定静态和运行时在"项目属性"页上检查代码契约。如果你知道不启用运行时检查、契约等。确保方法将不会在运行时抛出异常违反了。Visual Studio外接程序没有随Visual Studio一起发布2010或Windows SDK

对于这样的消息,准确地说明您所做的操作通常是有帮助的。

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

Contract.Requires vs Contract.Requires<Exception>

建议使用

Contract.Requires。根据手册

如果你的代码必须在失败时抛出一个特定的异常特殊的前提条件下,可以使用泛型重载形式在下面。(在提交此表格之前,请先阅读5.1节代码。不运行合同工具,无法使用Requires < Exn <Exn>>在所有构建中。如果您这样做,您将每次都得到一个运行时失败。