【问题标题】:Best way to check function parameters: Check for null or try/catch检查函数参数的最佳方法:检查 null 或 try/catch
【发布时间】:2010-10-21 14:40:06
【问题描述】:

在实现/使用返回或处理对象实例的方法时,检查函数参数最优雅的方法是什么?

调用方法:

someType GetSomething(object x)
{
    if (x == null) {
        return;
    }

    //
    // Code...
    //
}

或更好:

someType GetSomething(object x)
{
    if (x == null) {
        throw new ArgumentNullException("x");
    }

    //
    // Code...
    //
}

调用方法:

void SomeOtherMethod()
{
    someType myType = GetSomething(someObject);

    if (someType == null) {
        return;
    }

}

或更好:

void SomeOtherMethod()
{
    try {
        someType myType = GetSomething(someObject);
    } catch (ArgumentNullException) {
    }
}

浏览类似问题时,不使用 try/catch 的原因是性能。但是恕我直言,try-catch 看起来更好:)。

那么,哪种方式更“优雅”?

【问题讨论】:

    标签: c# exception-handling methods robustness


    【解决方案1】:

    如果传入 null 无效,则抛出异常(即 - 这是一个永远不应该发生的异常情况)。

    如果null参数有效,则返回对应的对象。

    一般来说,接受null 参数是不好的做法 - 它违反了最小意外原则,并且要求调用者知道它是有效的。

    【讨论】:

    • 具有评估非空输入并为空输入返回空的函数通常是一种有用的模式。在某些情况下,Null Object Pattern 可能更好,但使用泛型很难实现。
    【解决方案2】:

    就优雅而言,很难超越Code Contracts

    Contract.Requires(x != null);
    

    【讨论】:

      【解决方案3】:

      您应该只对例外情况使用例外。如果您希望参数可能(合法地)为空,您应该检查它——不要为此使用异常。如果将 null 传递给您的方法没有意义,IMO 您应该在调用站点(在调用之前)检查 null。

      【讨论】:

        【解决方案4】:

        在您的示例中,GetSomthing 是私有的。这意味着您可以跟踪所有调用者并确保不会传递 Null 值,例如

         if (x != null)
           someType myType = GetSomthing(x)
         else
           // Initialize  x or throw an InvalidOperation or return whatever is correct
        

        但是,如果它不是真正私密的,那么您应该按照 Oded 和其他人所说的那样做。在大多数情况下,检查它是否为 null 并抛出 ArguementExecption。

        【讨论】:

          猜你喜欢
          • 2013-11-21
          • 2012-04-03
          • 2012-10-24
          • 2011-04-30
          • 2014-05-22
          • 2015-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多