我应该使用CodeContract还是CuttingEdge.Conditions?

15

我研究了使用条件框架来验证数据的方法,而不是...

if(cond) throw new SomeException();

SomeFramework.MakeSure(cond);
最终我选择使用CodeContractCuttingEdge.Conditions框架之一。
我无法决定使用哪个框架。我可以告诉你,我不喜欢'CodeContract'框架的地方是需要安装额外的msi才能使用它以及需要选择的选项;这并不是说它不好,但感觉不太自然(当然,它仍在微软研究中)。
你认为呢?

嗯,对于 CuttingEdge.Conditions 你也需要安装一些东西。 - Tigran
你需要将一个库添加到项目中,而不是将MSI添加到整个VS。 - guyl
在这两种情况下,您都需要在项目中添加对第三方dll的引用。 - Tigran
3个回答

12

CodeContracts框架是.NET 4的一部分。因此,您可以在不安装任何内容的情况下编写针对其的代码,只是没有重写器组件时,代码合同在运行时不会有任何效果。我认为将其包含在框架中意味着Microsoft打算更多地整合代码合同。

根据CuttingEdge.Conditions CodePlex页面上的统计数据,它只被下载了4189次。语法有一些好处,但除非CuttingEdge.Conditions特别支持的某些功能不受CodeContracts支持,否则您最好使用.NET版本。

就我而言,代码合同的关键特点如下:

  1. 您可以在接口上设置代码合同,以指定实现这些接口的类型的预期行为。

  2. 代码合同是继承的。

我没有尝试过CuttingEdge.Conditions,但它似乎不支持这两个特性(而CodeContracts支持)。


10

主要区别在于Code Contracts包括静态检查器。这意味着您的合同将在编译时进行正确性检查。

此外,只要您正在构建.NET 4,您的用户就不需要安装任何东西。重写器在编译时工作,CC的其余部分是.NET的一部分。


1
哇 - "现在只有一个版本适用于每个Visual Studio版本(除了Express),并包括静态检查器!"因此,该功能不再仅限于Ultimate! :) - TrueWill
1
你确定吗?据我所知,为了让“Contract”起作用(插入IL),你仍然需要安装MSI并设置重写器。 - guyl
5
是的,但只有构建代码的机器需要安装它。一旦DLL被重写,你可以在任何没有Code Contracts的机器上运行它们。 - porges

5
编辑:我推荐使用https://github.com/adamralph/liteguard CuttingEdge.Conditions已经被分叉成为Conditions。原作者不再维护也不使用该项目:https://conditions.codeplex.com/workitem/20064 Mono中没有实现CodeContracts。有一个GSOC项目,但最终并没有得到完整的解决方案,所以如果目标是Xamarin.iOS/Xamarin.Android/Xamarin.Mac平台或仅限于mono,则Conditions是您唯一的选择。
该库现在是可移植类库,并默认支持跨平台: https://github.com/ghuntley/Conditionshttps://www.nuget.org/packages/Conditions/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接