Элегантная проверка на null и выход в C#

что такое элегантный способ написания этого?

if (lastSelection != null)
{
    lastSelection.changeColor();
}
else
{
    MessageBox.Show("No Selection Made");
    return;
}

changeColor() является функцией void, и функция, которая выполняет приведенный выше код, также является функцией void.

7 ответов


вы можете уменьшить беспорядок, изменив условие:

if (lastSelection == null)
{
    MessageBox.Show("No Selection Made");
    return;
}

lastSelection.changeColor();

хотя я лично очень не люблю иметь несколько операторов return в функции, согласно оборонительному программированию, которое я видел, вы поймаете условие ошибки и выйдете, и пропустите что-нибудь еще:

if(lastSelection == null)
{
    MessageBox.Show("No Selection Made");
    return;
}

lastSelection.changeColor();

трудно сказать, как я бы сделал это в своей собственной работе, не видя всей функции, к которой это относится.


Я бы соблазнился, чтобы убедиться, что lastSelection никогда не было null, и он указывает на "пустой" объект в случаях, когда он будет null в текущем дизайне. Тогда нет необходимости в нулевой проверке. Технических ошибок из системы это всегда хорошая практика.

IOW, я бы спросил, является ли неэлегантность в коде тем, как вы выполняете проверку null, или это тот факт, что проверка null требуется вообще.


видя, что все остальные получили хорошие ответы,Не делай этого:

if (lastSelection == null) goto ERR;
lastSelection.changeColor();
//... possibly more stuff...
return;
ERR:
MessageBox.Show("No Selection Made");

Это еще один способ реализации этого.

        Action _action = (lastSelection != null
                              ?
                                  new Action(lastSelection.changeColor)
                              :
                                  () => Console.WriteLine("No Selection Made"));
        _action.Invoke();

возможно, немного перебор, но у вас наверняка будут люди, поддерживающие ваш код, почесывая головы : -)


Я думаю, что ваш код хорош: вы проверили на нормальный случай (lastSelection != null) сначала для ненормального случая.

Я могу просто добавить одну модификацию:

if (lastSelection != null)
{
    lastSelection.changeColor();
    //your other normal code
}
else
{
    MessageBox.Show("No Selection Made");
    //return; //no need for this now
}

практика догоняет быстро, чтобы написать null сначала, как показано ниже:


if (null == lastSelection)
{
    MessageBox.Show("No Selection Made");
    return;
}

lastSelection.changeColor();