有 c# 吗?操作员短路?

Posted

技术标签:

【中文标题】有 c# 吗?操作员短路?【英文标题】:Does c# ?? operator short circuit? 【发布时间】:2011-07-16 04:34:19 【问题描述】:

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

例子:

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

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

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

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

【问题讨论】:

你为什么不试试呢?在右侧使用您自己的方法。 我很确定确实如此。否则我见过的很多代码都会被破坏。 MSDN文章没有提到,我也懒得在spec里查了。 因为我想知道权威(阅读:我很懒;) 这实际上是一个好点。如果你只是尝试它,你永远无法确定你观察到的行为是(a)你总是可以依赖的东西,或者(b)只是编译器的一些实现细节(例如一些优化)。为了安全起见,您需要检查文档以了解 指定 行为。 我看到很多这样的问题。为什么谷歌把我带到这里而不是语言规范?谷歌首先把我带到了这里:msdn.microsoft.com/en-us/library/ms173224.aspx为什么那个页面没有回答关于短路的问题? 【参考方案1】:

是的,C# Language Specification 中是这样说的(由我突出显示):

a ?? b 形式的空合并表达式要求 a 为可空类型或引用类型。如果a不为null,则a ?? b的结果为a;否则,结果为b仅当a 为空时,该操作才会评估b

【讨论】:

【参考方案2】:

是的,它短路了。

class Program

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

上述程序输出“Hi”而不是抛出NullReferenceException

【讨论】:

【参考方案3】:

是的。

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

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

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

【讨论】:

以上是关于有 c# 吗?操作员短路?的主要内容,如果未能解决你的问题,请参考以下文章

(47)C#里使用短路操作符

skip() 方法是短路操作吗?

着急,c#操作excel 问题,求解啊!!!

原生JavaScript灵魂拷问,你能全部答对吗?#yyds干货盘点#

C#在Sqlserver数据库中设置字段,在插入操作时不插入数据,有问题吗?

与 php 和 java 互操作的 C# dll