1

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

4

2 回答 2

3

它们是两种不同的工具。

Code Contracts是一种声明和检查的方式......好吧,合同,例如前置条件和后置条件:

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

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

        // TODO:
    }
}

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

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

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

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

于 2016-10-27T12:32:26.010 回答
1

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

另一种类型的分析器会查看样式(例如 StyleCop)、大写字母、驼峰式大小写、前缀、后缀以及您拥有的内容。

第三种是你提到的代码契约,它的工作方式略有不同。您声明代码的预期行为,例如传递给方法的参数的预期,您的代码可以抛出哪些异常等。然后,合同分析器将检查调用代码是否传递了正确的参数(例如,分析器将检测你传入 null 并且如果不允许这样做会引发错误)。同时它会检查你的方法的“内部一致性”,以确保你不会抛出你不允许抛出的异常。根据实现合同可以在运行时或编译时进行验证。

于 2016-10-27T12:35:13.223 回答