您的位置:知识库 » .NET技术

Visual Studio 2010 中的代码约定设置

来源: msdn  发布时间: 2011-07-05 16:00  阅读: 4115 次  推荐: 0   原文链接   [收藏]  

  软件约定称为代码约定,通过这一约定可以表示代码正常工作所需的正式条件。 如果方法未按预期收到数据或生成的数据不符合预期的后置条件,代码约定将导致代码引发异常。 有关前置条件和后置条件的概述,您可能需要查看我上个月发表的文章 (msdn.microsoft.com/magazine/gg983479)。

  代码约定是 .NET Framework 4 的一部分,但同样依赖于 Visual Studio 2010 中的一些功能,例如运行时工具、与 MSBuild 集成以及“项目属性”框中的属性页。 值得注意的是,仅编写前置条件和后置条件是不够的。 您还需要为每个项目启用运行时检查功能才能使用软件约定。 您可以通过 Visual Studio 2010 中的“代码约定”项目属性页来完成上述操作。

  在本文中,我将讨论您可以查看或选择的各个选项的预定用途,并深入讨论使用代码约定中的参数验证可以执行的最常见操作的重写程序工具和实践。

  代码约定属性页

  应在所有版本中还是仅在调试版本中实施代码约定前置条件和后置条件? 实际上,这取决于您对软件约定概念的理解。 它是设计工作的一部分吗? 或者,它仅是一种调试措施?

  如果它是设计功能,则没理由剥离发行版中的约定。 如果它仅是一种调试技术,当在发布模式中进行编译时,您不希望显示它。

  在 .NET Framework 中,代码约定仅是此框架的一部分并且未融入任何语言。 这样将更容易在项目中按版本配置它们。 因此,通过软件约定的 .NET Framework 实现,您可以决定实现约定的合适时间和地点。

  图 1 显示 Visual Studio 2010 中的属性页,通过此页可以设置软件约定为应用程序工作的方式。 请注意,此类设置基于项目应用,因此可以根据需要进行调整。

图 1 Visual Studio 2010 中代码约定的属性页

  您可以选择选项配置(调试、发布等)并仅对该配置应用设置。 这样,您可以启用代码约定用于调试但不用于发布,而且更重要的是,您可以随时改变决策。

  运行时检查

  若要启用代码约定,必须选中“执行运行时约定检查”选项。 如果未选中此选项,则在源代码中显示的任何约定说明将可能不会产生任何效果(定义了 DEBUG 符号的任何版本中的 Contract.Assert 和 Contract.Assume 例外,但这不是很重要)。 复选框控制是否在每个编译步骤结束时触发重写程序工具。 重写程序是一个外部工具,用于对软件约定进行后处理并修改 MSIL 代码,以及在合适的位置执行前置条件、后置条件和固定条件检查。

  但是,请注意,如果您具有类似下面这样的前置条件,则在关闭重写程序时会得到运行时断言失败:

Contract.Requires<TException>(condition)

  图 2 显示了您得到的消息框。

图 2 代码需要运行时约定检查

  若要详细查看运行时检查的工作方式,请考虑以下代码:

public Int32 Sum(Int32 x, Int32 y) {
// Check input values
ValidateOperands(x, y);
ValidateResult();

// Perform the operation
if (x == y)
return 2 * x;
return x + y;
}
  

  约定详细信息使用 ContractAbbreviator 存储在 ValidateXxx 方法中,如上个月的专栏所讨论。 以下是 ValidateXxx 方法的源代码:

[ContractAbbreviator]
private void ValidateOperands(Int32 x, Int32 y) {
Contract.Requires(x
>= 0 && y >= 0);
}

[ContractAbbreviator]
private void ValidateResult() {
Contract.Ensures(Contract.Result
<Int32>() >= 0);
}
  

  如果您使用 Contract.Requires 而不是 Contract.Requires<TException>,则在某个版本中关闭重写程序时不会出现图 2 所示的失败。 图 2 中的消息框是由 Contract.Requires 的内部实现所致,如下所示:

[Conditional("