Да предположим, че искам да проверя куп обекти, за да се уверя, че никой не е null:
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
е null, тогава ще получа NullReferenceException
, когато се опитам да предам obj.Parameters
на NoNulls
.
Така че горният подход е очевидно погрешен. Но операторът if
, използващ оператора &&
, работи добре, тъй като има късо съединение. И така: има ли някакъв начин да направите метод на късо, така че аргументите му да не се оценяват, докато не бъдат изрично посочени в метода?