Могу ли я вызвать собственное короткое замыкание в вызове метода?
Предположим, я хочу проверить несколько объектов, чтобы убедиться, что ни один из них не равен нулю:
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
заявление с использованием&&
Оператор работает просто отлично, так как он замкнут. Так:Есть ли способ сделать метод коротким замыканием, чтобы его аргументы не оценивались до тех пор, пока они не будут явно указаны в методе?