c#?? 操作员短路?

Til*_*dor 30 c# operators short-circuiting

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

例:

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

string test3 = test2 ?? test.ToLower();
Run Code Online (Sandbox Code Playgroud)

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

所以用另一种方式来表达这个问题:请问右手表达的问题是什么?如果左手不为空,则运算符得到评估?

Hei*_*nzi 49

是的,它在C#语言规范中这样说(由我强调):

表单的空合并表达式a ?? b需要a是可空类型或引用类型.如果a是非null,则结果a ?? ba; 否则,结果是b.仅当null为null时,操作b才会计算a.


Dan*_*Tao 16

是的,它短路.

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

上面的程序输出"Hi"而不是抛出一个NullReferenceException.


Pet*_*son 7

是.

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

    private string test()
    {
        MessageBox.Show("does not short circuit");
        return "test";
    }
Run Code Online (Sandbox Code Playgroud)

如果它没有短路,将调用test()并且消息框将显示它"不会短路".