代码契约与代码分析器

Code Contracts vs Code Analyzers

我即将开始一个新的 C# 项目。我想知道使用代码契约或代码分析器(在 Roslyn 中)之间有什么区别。我误解了每个的用法吗?作为一个新项目,我想保持代码的完整性。所以我希望其他开发人员遵守特定的代码准则。我会进一步研究,但我想先征求社区的意见。不好意思,我对 C# 开发还是比较陌生。

它们是两种不同的工具。

Code Contracts 是一种声明和检查...好吧,合同,例如先决条件和 post-条件:

public class Foo
{
    public Foo(object arg)
    {
        Contract.Requires<ArgumentNullException>(arg != null);
    }

    public object GetBar()
    {
        Contract.Ensures(Contract.Result<object>() != null);

        // TODO:
    }
}

CC 在 运行 时检查他们的条件。这需要您的 程序集(不是源代码!) 在编译后重写以将适当的调用注入您的代码。

代码分析器使用 Roslyn 在您编写代码时分析源代码。 它们可以帮助您格式化代码、提醒您在 IDisposable 上调用 Dispose 等等,但它们不会直接影响 运行 时间行为。

有许多分析器,按用途分组到项目中(例如 StyleCopAnalyzers), while Code Contracts 是一个独立的项目。

(CC 也有静态分析器,但我不能在这里说太多 - 它在实际项目中使用时会降低性能,所以,对我来说,它通常是关闭的。无论如何,它是为了检查合同。)

代码分析器将分析您的代码是否存在常见错误。他们查看代码的结构和数据流以检测问题。

另一种类型的分析器会查看样式(例如 StyleCop)、大写字母、驼峰式大小写、前缀、后缀等等。

第三种是你提到的代码契约,它的工作原理略有不同。您声明代码的预期行为,例如传递给方法的参数的预期行为,您的代码可以抛出哪些异常等。然后,契约分析器将检查调用代码是否传递了正确的参数(例如,分析器将检测您传入 null 并在不允许的情况下引发错误)。同时它会检查你的方法的 "internal consistency" 以确保你不会抛出你不允许抛出的异常。根据实施合同可以在运行时或编译时验证。