请澄清,代码合同是否类似于FxCop和StyleCop? 根据在线参考,我们需要添加代码以在现有代码的功能内实现代码契约条件。
public void Initialize(string name, int id)
{
Contract.Requires(!string.IsNullOrEmpty(name));
Contract.Requires(id > 0);
Contract.Ensures(Name == name);
//Do some work
}
通常在FxCop中,我们要检查的代码将位于单独的Dll中,包含要检查的规则的类库将位于单独的dll中。 同样,我们是否可以为Code契约创建单独的类库以规范现有代码?
请确认..
答案 0 :(得分:3)
免责声明:您最好采用他们当前的文档并阅读它们,记下这些功能然后进行比较。我在下面写的是我很久以前记得的一些关于它们的核心功能的事实,我不能保证它们不会过时而且现在是错误的。例如,某人可能会为FxCop编写一些复杂且繁重的规则,其行为与合同相同。这就是为什么我将它标记为社区维基。如果我在任何地方都错了,请纠正我。
不,他们不相似,虽然他们有共同的目标:帮助你找到错误。
FxCop是一个“静态分析器”,它会检查您的代码并尝试查找“不良模式”。在运行时期间,您不会看到任何FxCop 规则 /效果。 FxCop有一套“规则”,将在检查期间使用,并在发现规则被破坏时向您报告。规则非常简单,可以像you must initialize every variable
或you must name classes with uppercase
那样挑剔,也可以像you shouldn't have more than one loop in a method
那样复杂。标准安装提供了一些规则,您可以使用自己的规则扩展规则集。
CodeContracts是双面的。在最基本的层面上,它是一组辅助方法,如throw if argument 'foo' is null
。在运行时,当有人传递null时,它将抛出。就这么简单。但是,如果在代码中正确且广泛地使用这些辅助方法,则可以运行其他静态分析器。它将扫描您的代码,查找这些帮助方法的所有用法,并尝试自动检测其合同不满意的任何地方。因此,在“参数为空”的例子中,它将尝试查找该函数的所有用法,检查谁用什么args调用它,它将尝试推断(证明)该arg是否可以随时为null,并且将警告你,如果发现这种情况。除了非null之外,还有更多类型的此类验证器,但您无法添加/编写自己的验证器。我的意思是,你可以添加更多这样的辅助验证器,但是静态分析器不会选择它们(为任何规则编写一般定理证明器太难了。)
CodeContracts在分析方面比FxCop更强大,但在多样性和范围方面有限。 CodeContracts无法检查代码的结构:它不会检查循环次数,代码复杂性,方法名称,代码层次结构等。它只能尝试证明/反驳一些合同(运行时要求)一些方法/接口。另一方面,FxCop可以检查你的代码,样式,结构等,但它不会“证明”或“推断”任何东西 - 它只会检查规则定义的一些不良模式。
答案 1 :(得分:1)
虽然FxCop
用于验证某些代码风格或典型的性能问题,
Code Contracts
会影响您的代码设计,因此它旨在实现更高级别的目标。这是.NET
语言中使用的contract programming方法的Eiffel
实施尝试。方法论说,每种类型都会表现正确(执行其后置条件和不变量),只要它根据所需的前提条件进行输入。
您应该使用库助手方法和属性(Contract.Requires
等)来描述您的类型前置条件,不变量和后置条件,并且Code Contracts
静态分析器将能够在编译期间检测它们的失败。 / p>
(上次我看过它,工具很慢而且难以使用。似乎,它还没有被微软研究团队完成。幸运的是,前几天有new version它有已发布async-await
以及VS2015支持的错误修复程序。)