代码契约与代码分析器
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" 以确保你不会抛出你不允许抛出的异常。根据实施合同可以在运行时或编译时验证。
我即将开始一个新的 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" 以确保你不会抛出你不允许抛出的异常。根据实施合同可以在运行时或编译时验证。