这是我的问题。我是一个非常喜欢通过合同设计,我使用这个概念,特别是在开发库,可供其他开发人员使用。我刚刚发现了一种新的方法,那就是: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什么也不做,即使name是null!
MSDN文档说:
指定包围方法或属性的先决条件契约。
但是,如果不满足条件,则不指定任何内容!
我还注意到有其他 Contract.Requires重载抛出异常,显示消息.但是Contract.Requires(Boolean)是用来做什么的呢?
下面的编辑答案突出显示,必须安装插件才能拥有Contract API的全部功能,但是对于希望自己的代码在不同平台上运行相同的Mono用户呢?
发布于 2011-11-28 19:19:44
你应该做以下几点:
Contract.Requires替换Contract.Requires<SomeException> (第一个抛出System.Diagnostics.ContractException,而第二个抛出您指定的异常,这对于公共方法非常重要)这是基本的设置。要获得更精确的配置,请使用请参阅手册
如果您使用Mono,可能合同类是空的。我还没有这样做,但是合同手册的第七章似乎解释了如何提供您自己的实现。
发布于 2011-11-28 19:01:53
来自合同类文件
重要 必须安装Visual外接程序才能强制执行合同.代码合同高级版外接程序允许在“项目属性”页面中指定代码契约的静态和运行时检查。如果不启用运行时检查,则如果合同被违反,Contract.Ensures方法等合同在运行时不会抛出异常。Visual外接程序不随Visual 2010或Windows一起发布.
发布于 2011-11-28 19:16:36
有了这样一条消息,准确地指定您所做的事情通常是有帮助的。
例如,如果您已经安装了VS插件,或者您已经在项目属性下启用了它,或者您实际上正在调试和发布模式下运行,那么您就不会在原始消息中提到。
关于Contract.Requires和Contract.Requires<Exception>
推荐使用Contract.Requires。根据手册
如果您的代码必须在特定前提条件失败时抛出特定的异常,则可以使用下面的泛型重载表单。(在您的代码中提交此表单之前,请阅读5.1节。如果没有在所有构建上运行契约工具,就不能使用
Requires < Exn <Exn>>。如果这样做,则每次都会出现运行时故障。)
https://stackoverflow.com/questions/8300815
复制相似问题