代码合同与代码分析器

时间:2016-10-27 11:32:50

标签: c# roslyn contracts

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

2 个答案:

答案 0 :(得分:2)

它们是两种不同的工具。

代码合同是一种声明和检查......合同,例如前置条件和后置条件的方式:

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

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

        // TODO:
    }
}

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

代码分析器使用Roslyn在您编写源代码时对其进行分析。 他们可以帮助您格式化代码,提醒您在Dispose上致电IDisposable,依此类推,但它们不会直接影响运行时行为。

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

(CC也有静态分析仪,但我不能在这里讲得很多 - 它在实际项目中使用会导致性能下降,因此,对我来说它通常是关闭的。无论如何,它都是为了检查合同。)

答案 1 :(得分:1)

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

另一种类型的分析器会查看样式(例如StyleCop),大写字母,驼峰外壳,前缀,后缀和你有什么。

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