C#: снижение шума в линии при проверке работоспособности
Возможный дубликат:
Ярлык для "ноль, если объект нуль, или object.member, если объект не нуль"
Я хотел бы, чтобы был способ сделать этот тип теста проще в C#:
if (foo != null &&
foo.bar != null &&
foo.bar.baz != null &&
foo.bar.baz.bat != null)
{
var bat = foo.bar.baz.bat;
bat.cat = 5;
bat.dog = 6;
}
Одна возможная особенность, которая поддержит это, - это если операторы, которые поддерживают объявления новых переменных, например
if (foo != null &&
(var bar = foo.bar) != null &&
(var baz = bar.baz) != null &&
(var bat = baz.bat) != null)
{
bat.cat = 5;
bat.dog = 6;
}
Прибыль здесь может быть неочевидной, поскольку предлагаемое решение на самом деле длиннее в этом примере. Но с более длинными именами это действительно окупится.
Есть ли лучший способ сделать это? Есть ли шанс, что подобное предложение на самом деле превратится в будущую версию языка (зовите Эрика Липперта, заходите)?
3 ответа
Хороший вопрос, но плохие намерения. Ваш код будет игнорировать закон Деметры
Обычно я просто перемещаю выражение в операторе if к его собственному методу в нижней части файла:
if (CheckBat(foo))
{
var bat = foo.bar.baz.bat;
bat.cat = 5;
bat.dog = 6;
}
... snip ...
private bool CheckBat(MyFoo foo)
{
return foo != null &&
foo.bar != null &&
foo.bar.baz != null &&
foo.bar.baz.bat != null;
}
Это довольно часто запрашиваемая функция, и в результате этот вопрос теперь задавался несколько раз в Stackru. Увидеть
Ярлык для "ноль, если объект нуль, или object.member, если объект не нуль"
для некоторых мыслей по этому поводу.