CodeContract 是否类似于 FxCop?

Is CodeContract similar to FxCop?

请说明一下,Code Contracts 是否类似于 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 中,而包含要检查的规则的 Class 库将在单独的 dll 中。 同样,我们是否可以为代码合约创建单独的 class 库来管理现有代码?

请确认..

免责声明:您最好拿下他们当前的文档并通读,写下功能然后进行比较。我在下面写的是我很久以前记得的关于它们核心功能的一些事实,我不能向你保证它们没有过时和现在是错误的。例如,有人可以为 FxCop 编写一些复杂而繁重的规则,这些规则的行为与合同一样。这就是我将其标记为社区维基的原因。有不对的地方请指正


不,它们并不相似,尽管它们有共同的目标:帮助您找到错误。

FxCop 是一个 "static analyzer",它会检查您的代码并尝试找到 "bad patterns"。在 运行 时间内,您不会看到任何 FxCop rules/effects。 FxCop 有一组 "rules" 将在检查期间使用,它会在发现规则被破坏时向您报告。规则可以非常简单和挑剔,如 you must initialize every variableyou must name classes with uppercase 或复杂的规则,如 you shouldn't have more than one loop in a method。标准安装提供了一些规则,您可以使用自己的规则扩展规则集。

CodeContracts 是双向的。在最基本的层面上,它是一组辅助方法,如 throw if argument 'foo' is null。在运行的时候,当有人传递一个null时,它就会抛出。就这么简单。但是,如果您在代码中正确且广泛地使用这些辅助方法,您将能够 运行 一个额外的静态分析器。它将扫描您的代码,找到这些辅助方法的所有用法,并会尝试自动检测它们的 contracts 不满足的任何地方。因此,对于 "argument is null" 示例,它将尝试查找该函数的所有用法,检查谁使用什么参数调用它,它将尝试推断(证明)该参数是否可以随时为空,并且将如果发现这种情况,请警告您。除了 not-null 之外,还有更多类型的此类验证器,但您不能 add/write 自己的。我的意思是,您可以添加更多这样的辅助验证器,但静态分析器不会拾取它们(为任何规则编写通用定理证明器太难了)。

CodeContracts 的分析比 FxCop 更强大,但多样性和范围有限。 CodeContracts无法检查代码的结构:它不会检查循环次数、代码复杂度、方法名称、代码层次结构等。它只能尝试prove/disprove一些contracts(运行时间要求)一些 methods/interfaces。另一方面,FxCop 可以检查您的代码、样式、结构等,但它不会 "prove" 或 "deduce" 任何东西 - 它只会检查规则定义的一些不良模式。

虽然FxCop用于验证一些代码风格或典型的性能问题, Code Contracts 影响你的代码设计,所以它旨在实现更高层次的目标。这是 Eiffel 语言中使用的 contract programming 方法的 .NET 实施尝试。 Methodology 说,每种类型都会正确运行(执行其后置条件和不变量),前提是它会根据所需的先决条件进行输入。

您应该使用库辅助方法和属性(Contract.Requires 等)来描述您的类型前提条件、不变量和后置条件,并且 Code Contracts 静态分析器将能够在编译期间检测到它们的失败.

(上次看的时候,工具比较慢,不好用,貌似微软研究组还没完成,还好前几天有一个new version已发布,其中包含 async-await 的错误修复以及 VS2015 支持。)