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, если объект не нуль"

для некоторых мыслей по этому поводу.

Другие вопросы по тегам