假设我想检查一堆对象以确保没有一个为空:
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
为空,那么NullReferenceException
当我尝试传递obj.Parameters
给NoNulls
.
因此,上述方法显然是错误的。但是if
使用运算符的语句&&
工作得很好,因为它是短路的。那么:有没有办法使方法短路,以便在方法中明确引用之前不会评估其参数?