¿Puedo forzar mi propio cortocircuito en una llamada de método?
Supongamos que quiero revisar un montón de objetos para asegurarme de que ninguno sea nulo:
if (obj != null &&
obj.Parameters != null &&
obj.Parameters.UserSettings != null) {
// do something with obj.Parameters.UserSettings
}
Es una posibilidad atractiva escribir una función auxiliar para aceptar un número variable de argumentos y simplificar este tipo de verificación:
static bool NoNulls(params object[] objects) {
for (int i = 0; i < objects.Length; i++)
if (objects[i] == null) return false;
return true;
}
Entonces el código anterior podría convertirse en:
if (NoNulls(obj, obj.Parameters, obj.Parameters.UserSettings)) {
// do something
}
¿Derecha?Incorrecto. Siobj
es nulo, entonces obtendré unNullReferenceException
cuando trato de pasarobj.Parameters
aNoNulls
.
Así que el enfoque anterior está claramente equivocado. Pero elif
declaración utilizando el&&
El operador funciona bien ya que está en cortocircuito. Asi que:¿Hay alguna manera de hacer que un método esté en cortocircuito, de modo que sus argumentos no se evalúen hasta que se haga una referencia explícita dentro del método?