优雅检查null并退出C#

时间:2010-03-14 03:50:19

标签: c# coding-style null conditional

写这个的优雅方式是什么?

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

changeColor()是一个void函数,运行上面代码的函数也是一个void函数。

7 个答案:

答案 0 :(得分:14)

您可以通过扭转条件来减少混乱:

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

lastSelection.changeColor();

答案 1 :(得分:9)

虽然我个人真的不喜欢在函数中使用多个return语句,但根据我见过的防御性编程,你会捕获错误条件并退出,并通过以下任何其他方式:

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

lastSelection.changeColor();

如果没有看到它所属的整个功能,很难说我在自己的工作中如何做到这一点。

答案 2 :(得分:2)

我很想确保lastSelection永远不会为null,并且在当前设计中它将为null的情况下指向一个“空”对象。然后,不需要空检查。从系统中设计出可能的错误总是很好的做法。

IOW,我会问,代码中的不合理是否是你如何进行空检查,或者是否是否需要在所有进行空检查。

答案 3 :(得分:1)

看到其他人都得到了好的答案,不要这样做

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

答案 4 :(得分:1)

这是实现此目的的另一种方式。

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

也许有点矫枉过正,但你肯定会让人们保持代码的头脑: - )

答案 5 :(得分:0)

我认为你的代码很好:你首先检查了正常情况(lastSelection != null)然后检查了异常情况。

我可以添加一个修改:

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

答案 6 :(得分:0)

快速追赶的做法是首先写下null,如下所示:


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

lastSelection.changeColor();