我研究了使用条件框架来验证数据而不是
if(cond) throw new SomeException();
SomeFramework.MakeSure(cond);
最后,我的选择是使用CodeContract
或CuttingEdge.Conditions
框架。
我无法决定使用哪个框架。我可以告诉你,我不喜欢'CodeContract'框架,你必须安装额外的msi
才能使用它和你需要选择的选项;不是那么糟糕,但感觉不自然。 (当然它仍在MS研究中。)
您怎么看?
答案 0 :(得分:12)
CodeContracts
框架是.NET 4的一部分。因此,您可以编写代码而无需安装任何内容,只是没有重写器组件,代码协定在运行时不会产生任何影响。我将此包含在框架中,作为微软打算在未来更多地整合代码合同的标志。
根据CuttingEdge.Conditions
CodePlex page的统计数据,仅下载了4,189次。语法有一些很好的东西,但除非CuttingEdge.Conditions
而不是CodeContracts
特别支持某些内容,否则您可能会坚持使用.NET的一部分版本。
就我而言,代码合约的主要特征如下:
您可以在接口上设置代码合约,以指定实现这些接口的类型的预期行为。
代码合同是继承的。
我没有尝试过CuttingEdge.Conditions
,但是它支持这两个功能并不明显(而CodeContracts
确实如此)。
答案 1 :(得分:10)
主要区别在于代码合同包括静态检查程序。这意味着您的合同将在编译时检查是否正确。
此外,只要您构建.NET 4,您的用户就不需要安装任何东西。重写器在编译时工作,CC的其余部分是.NET的一部分。
答案 2 :(得分:5)
修改:我建议人们使用https://github.com/adamralph/liteguard
CuttingEdge.Conditions已经分叉成为条件。原作者不再维护或使用该项目:https://conditions.codeplex.com/workitem/20064
CodeContracts未在Mono中实现。有一个GSOC项目,但它没有最终得到一个完整的解决方案所以条件是你唯一的选择,如果针对Xamarin.iOS / Xamarin.Android / Xamarin.Mac平台或只是单声道。
该库现在是一个可移植的类库,默认情况下跨平台支持位于:
https://github.com/ghuntley/Conditions和https://www.nuget.org/packages/Conditions/