7

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

调用方法:

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 看起来更好:)。

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

4

4 回答 4

9

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

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

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

于 2010-10-21T14:43:08.133 回答
4

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

Contract.Requires(x != null);
于 2010-10-21T15:21:44.310 回答
2

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

于 2010-10-21T14:44:17.613 回答
0

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

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

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

于 2010-10-21T15:13:06.280 回答