.net - 为什么我要在公共(public)方法中使用代码契约?

标签 .net code-contracts

恕我直言,由于任何其他程序员都可以调用带有参数的公共(public)方法,因此它有责任验证参数值并抛出有意义的 ArgumentException , 如果其中任何一个无效。

话虽如此,我为什么更喜欢这个:

public void Toto(string parameter)
{
    Contract.Requires(parameter != null);
    //...
}

……过了这个?
public void Toto(string parameter)
{
    if (parameter == null)
        throw new ArgumentNullException(nameof(parameter));
    //...
}

在第一种情况下,必须启用运行时契约检查才能引发异常。正如我们所知,对于发布版本,此选项可能未选中,这意味着不会发生参数验证。对于任何您可能认识或可能不认识的任何人都可以使用的公共(public)方法作为已发布产品的一部分,这似乎是个坏主意。

即使为发布版本启用运行时检查,将被抛出的异常也不会是典型的 .NET 开发人员所期望的(在这种情况下为 ArgumentNullException)。

那么我错过了什么?为什么我要使用代码契约而不是“传统的”if-throw 模式?

最佳答案

您将使用契约(Contract),因为它允许使用您的代码的人使用静态分析器来查找代码中的错误。此外,您可能希望确保您实现了 Contract.Ensures 方法,以便其他程序员知道您的函数保证返回什么。

您可能会为您的发布代码使用替代的 requires 格式。

public void Toto(string parameter)
{
    Contract.Requires<ArgumentNullException>(parameter != null);
    //...
}

因为如果参数为空,这个版本实际上会抛出异常。

关于.net - 为什么我要在公共(public)方法中使用代码契约?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957692/

相关文章:

c# - 从 EntityFramework ObjectContext 获取类型集合

c# - 如何强制执行 C#/.NET 的代码样式,例如 IDE0058、IDE0059 和 IDE0060?

c# - 检索具有特殊字符的嵌入资源

c# - CodeContract 认为分配的只读字段可以为空

c# - C# 中的代码契约和空值检查

.net - .NET 4.0 中代码契约的实际用途是什么?

c# - 从数据集和数据表生成 Crystal 报表

c# - 如何正确使用代码契约?

c# - 使 Contract.Assert 抛出异常而不是显示对话框

c# - 从 Uri 对象 C# 获取文件扩展名或 "HasExtension"类型 bool