我想知道我应该抛出异常还是调用 Contract.Requires<TException>

例如:

public static void Function(String str)
{
    if (str == null) throw new ArgumentNullException("str", "Input string cannot be null.");

    // ...
}


public static void Function(String str)
{
    Contract.Requires<ArgumentNullException>(str != null, "Input string cannot be null.");

    // ...
}

由于 Contract.Requires<TException> 不需要CONTRACTS_FULL符号,因此我也可以将其保留在发行版本中。

这是我的考虑:

约束:您不能调用自定义异常类型构造函数的重载版本。根本没有办法将其他参数传递给构造函数。

专业版:静态工具支持(例如,通知调用者违约)。

我应该使用哪一种,以及在哪种情况下使用?

最佳答案

CodeContract用户指南中记录的if-then-throwRequires<TException>之间的基本权衡是如何使用发布位进行构建。

案例1 :您仅使用if-then-throw,不使用Requires<TException>。在这种情况下,您可以构建释放位,而无需在dll/exe上运行契约(Contract)工具。这样做的好处是您可以更快地构建,并且不会冒该工具引入错误的风险。第二个优点是团队成员可以选择不使用CodeContract工具。缺点是您无法继承require的契约(Contract)继承,并且契约(Contract)不一定对工具可见(除非您使用EndContract)。您可以通过使用组装模式来指定这种情况:自定义参数验证

Case2 :您决定始终在发布位上运行CodeContract工具。这使您可以使用Requires<TException>并获得契约(Contract)的继承,包括接口(interface)的检测等。您的契约(Contract)是干净的且可识别工具。缺点是每个构建您的代码的人都必须安装CodeContracts工具。您可以使用组装模式来指定这种情况:“契约(Contract)”属性 Pane 中的“标准”。

希望这样可以解决问题。

10-04 14:58