这是我的问题。我是契约设计的忠实粉丝,我正在使用这个概念,特别是在开发可供其他开发人员使用的库时。我刚刚找到了一种新的方式: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文档说:
指定封闭方法或的封面前提条件 属性。
但是如果条件不满足则没有指定任何内容!
我还注意到有other Contract.Requires
重载会抛出异常,显示消息......但是Contract.Requires(Boolean)
是什么?
编辑下面的答案强调必须安装一个插件才能拥有Contract
API的全部功能,但是那些希望他们的代码在不同代码上行为相同的Mono用户呢?平台?
答案 0 :(得分:25)
您应该执行以下操作:
Contract.Requires
代替您的Contract.Requires<SomeException>
(第一个抛出System.Diagnostics.ContractException
,而第二个抛出您指定的对公共方法很重要的异常)这是基本设置。要获得更准确的配置,refer to the manual
如果使用Mono,可能是Contract类为空。我没有这样做,但是合同手册中的第七章似乎解释了如何提供自己的实现。
答案 1 :(得分:11)
重要
您必须安装Visual Studio加载项才能强制执行合同。 Code Contracts Premium Edition加载项允许您指定静态和运行时 检查项目“属性”页面上的代码合同。如果你这样做 不启用运行时检查,Contract.Ensures之类的合同 如果是合同,方法将不会在运行时抛出异常 侵犯。 Visual Studio加载项不随Visual Studio一起提供 2010或Windows SDK。
答案 2 :(得分:2)
通过这样的消息,确切地指定您所做的事情通常很有帮助。
例如,如果您已经安装了VS Addon,也没有在原始消息中提及,也没有在项目属性下启用它,或者您实际上在调试与发布模式下运行等等。
重新Contract.Requires
与Contract.Requires<Exception>
Contract.Requires
。
根据手册
如果您的代码必须在a失败时抛出特定异常 特殊前提条件,您可以使用通用重载表单 下面。 (在您的表格中提交此表格之前,请阅读第5.1节 码。如果不运行合同工具,则无法使用
Requires < Exn <Exn>>
在所有构建上。如果这样做,每次都会出现运行时故障。)