C#中的 ?? 运算符是否支持短路计算?

37
在使用C#中的??操作符时,如果被测试的值不为空,它会进行短路吗?
示例:
string test = null;
string test2 = test ?? "Default";

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

test3这一行代码会成功执行还是抛出null引用异常?

换句话说,如果左侧表达式不为null,那么??运算符的右侧表达式会被评估吗?


16
为什么不试试呢?在右边使用你自己的方法。 - Hans Passant
我非常确定它是这样的。否则,我看到的很多代码都会出错。MSDN文章没有提到它,而我又太懒得在规范中查找。 - CodesInChaos
4
因为我想权威地了解(注:其实是因为我懒 ;) - Tilendor
27
这实际上是一个很好的观点。如果你只是“尝试”它,你永远无法确定你观察到的行为是(a)你始终可以依赖的东西还是(b)编译器的某些实现细节(例如某些优化)。为了保险起见,你需要查阅文档以获取指定的行为。 - Heinzi
我看到很多类似的问题。为什么谷歌把我带到这里而不是语言规范呢?谷歌首先把我带到了这个链接:https://msdn.microsoft.com/en-us/library/ms173224.aspx 为什么那个页面没有回答关于短路的问题呢? - Trade-Ideas Philip
@Trade-IdeasPhilip:1. 因为语言规范是一个可以从 MS 下载中心下载的 Word 文件,因此不适合 Google 搜索。2. 因为有时候 Stack Overflow 比 MSDN 更好。;-) - Heinzi
3个回答

56

是的,在C#语言规范中有提到(我加了高亮):

形如a ?? b的空值合并表达式要求a为可空类型或引用类型。如果a不为空,则结果为a;否则结果为b只有在a为空时,这个操作才会计算b


18

是的,它进行了短路运算。

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

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


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

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

如果没有短路,将会调用test()函数并显示一个消息框,上面写着“不会短路”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接