2016-10-27 132 views
1

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

回答

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分析源代码。 他们可以帮助您格式化代码,提醒您在IDisposable上调用Dispose等,但它们不会直接影响运行时行为。

有很多分析仪,按用途划分成项目(如StyleCopAnalyzers),而Code Contracts是一个独立的项目。

(CC也有静态分析仪,但这里我不能说太多 - 它在真实项目中使用时会导致性能下降,所以对我来说它通常是关闭的,无论如何,它打算检查合同)

+0

谢谢你。所以Code Contracts会影响性能? –

+1

如果您想了解更多关于代码合同的信息,请查看本电子书https://www.syncfusion.com/resources/techportal/details/ebooks/csharpcontracts –

+1

@JonMeyers:由于重写,CC将增加构建项目的时间。在运行时,合同比“如果......抛出”要慢,但我怀疑,在大多数情况下你会看到差异。同时,使用CC还有很大的好处。 – Dennis

1

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

另一种类型的分析器着眼于样式(例如StyleCop),大写字母,骆驼套,前缀,后缀和你有什么。

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