在实现/使用返回或使用对象实例的方法时,检查函数参数的最优雅方法是什么?
致电方法:
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的原因是性能。但恕我直言,尝试捕捉看起来更好:)。
那么,哪种方式更“优雅”?
答案 0 :(得分:9)
如果传入null
无效,则抛出异常(即 - 这是永远不会发生的异常情况。)
如果null
参数 有效,则返回相应的对象。
一般来说,接受null
参数是不良做法 - 这违背了最不出意的原则,并要求来电者知道它是有效的。< / p>
答案 1 :(得分:4)
就优雅而言,很难超越Code Contracts。
Contract.Requires(x != null);
答案 2 :(得分:2)
您应该只对例外情况使用例外。如果您希望参数可能(合法地)为null,则应该检查它 - 不要使用异常。 IMO你应该在调用站点检查null(如果调用之前的),如果将null传递给你的方法是没有意义的。
答案 3 :(得分: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。