我刚刚尝试使用
Code Contracts,与
if statement没有任何真正的优势.
请考虑以下几点.
private static void BindClassesToInterfacesByConvention(string classesEndingWith,string interfacesEndingwith) { Contract.Requires<ArgumentNullexception>( string.IsNullOrWhiteSpace(classesEndingWith),"classesEndingWith"); Contract.Requires<ArgumentNullException>( string.IsNullOrWhitespace(interfacesEndingWith),"interfacesendingWith"); ... }
我发现它比使用if语句更容易混淆
private static void BindClassesToInterfacesByConvention(string classesEndingWith,string interfacesEndingwith) { if (string.IsNullOrWhiteSpace(classesEndingWith)) throw new ArgumentNullException("classesEndingWith"); if (string.IsNullOrWhitespace(interfacesEndingWith)) throw new ArgumentNullException("interfacesendingWith"); ... }
代码合同应该在编译时警告我违反合同.所以,当我写了以下内容时,我期待得到错误或警告.
BindClassesToInterfacesByConvention(null,null);
没有发生任何事情,一切编辑都很好,也没有出现错误和警告信息.
在这种情况下,我认为最好继续这样做.或者也许是对代码合同的不公平使用?
解决方法
代码合同是一个很好的想法,通过不完全在那里的模具放下.
首先,为了使异常实际抛出,您必须在Visual Studio中安装正确的扩展,和/或在项目中配置正确的设置.如果您有依赖于代码合同的单元测试在运行时抛出异常并在构建服务器上运行异常,那么非常有趣.
首先,为了使异常实际抛出,您必须在Visual Studio中安装正确的扩展,和/或在项目中配置正确的设置.如果您有依赖于代码合同的单元测试在运行时抛出异常并在构建服务器上运行异常,那么非常有趣.
然而,重要的是要明白,代码合同的真正目的不仅仅是抛出异常.它启用静态代码分析(如果您切换它),启用时可能会在编译时给您一个错误 – 但它确实需要您做很多工作来应用它几乎所有地方为了静态代码分析真的有效.我相信这是你试图测试的场景?在这种情况下,我建议您查看项目的代码合同设置,以确保已启用所有静态代码检查(这将使您的构建相当长).
此外,重要的是,代码合同允许您将意图传达给您的方法的呼叫者; Intellisense将根据您指定的条件(如果您安装了正确的扩展名).关于代码合同的信息也可以自动添加到可以伴随程序集的XML文件中,这样可以让程序集的第三方用户在编写代码时了解您的要求,并允许您将此信息包含在内在用沙堡等建造的帮助文件中
这是一个好主意,只是没有真正完全实现的工具,所以你有一些有趣的行为一段时间.我个人现在已经停止使用它们了.