假设我要检查组对象,以确保没有为空:我可以在方法调用中强制自己的短路吗?
if (obj != null &&
obj.Parameters != null &&
obj.Parameters.UserSettings != null) {
// do something with obj.Parameters.UserSettings
}
这是一个诱人的前景写一个辅助函数来接受可变数量的参数,并简化这种检查:
static bool NoNulls(params object[] objects) {
for (int i = 0; i < objects.Length; i++)
if (objects[i] == null) return false;
return true;
}
接着上面的代码将变成:
if (NoNulls(obj, obj.Parameters, obj.Parameters.UserSettings)) {
// do something
}
,对吗? 错误。如果obj
为空,那么当我尝试将obj.Parameters
传递给NoNulls
时,我会得到NullReferenceException
。
所以上述方法显然是错误的。但if
声明使用&&
运算符工作得很好,因为它是短路的。所以:是否有任何方法使方法短路,以便它的参数不被评估,直到在方法中明确引用?
你真正需要解决这个问题并不是懒惰的方法论证评估 - 尽管如你所见,这可以做到这一点。最好是运算符x.?y具有(x == null?null:x.y)的语义 - 这样你可以说“if(obj.?Parameters.?UserSettings == null)”。我们考虑过C#4的这样一个运算符,但从未实现它。也许对于假设的未来版本。 – 2009-12-16 20:59:00
这真的很有趣。有没有其他语言实现等效的运算符? – 2009-12-16 21:08:14
@Chris:Groovy呢。它被称为无效的解除引用操作符。很高兴听到C#团队考虑到它并可能再次考虑它:) – 2009-12-16 21:21:35