37

在C#中使用??运算符时,如果被测试的值不为空,是否会短路?

例子:

string test = null;
string test2 = test ?? "Default";

string test3 = test2 ?? test.ToLower();

test3 行成功还是抛出空引用异常?

所以用另一种方式来表达这个问题:右手会表达 ?? 如果左手不为空,则对运算符进行评估?

4

3 回答 3

55

是的,它在C# 语言规范中是这样说的(由我突出显示):

表单的空合并表达式a ?? b需要a是可空类型或引用类型。如果a为非空,则结果a ?? ba;否则,结果为b该操作仅在为 null时进行评估。ba

于 2011-03-15T22:48:17.760 回答
18

是的,它短路了。

class Program
{
    public static void Main()
    {
        string s = null;
        string s2 = "Hi";
        Console.WriteLine(s2 ?? s.ToString());
    }
}

上面的程序输出“Hi”而不是抛出NullReferenceException.

于 2011-03-15T22:38:01.443 回答
8

是的。

    public Form1()
    {
        string string1 = "test" ?? test();
        MessageBox.Show(string1);
    }

    private string test()
    {
        MessageBox.Show("does not short circuit");
        return "test";
    }

如果它没有短路,将调用 test() 并且消息框会显示它“没有短路”。

于 2011-03-15T22:44:33.740 回答