【问题标题】:Does c# ?? operator short circuit?有 c# 吗?操作员短路?
【发布时间】: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为什么那个页面没有回答关于短路的问题?

标签: c# operators short-circuiting


【解决方案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() 会被调用并且一个消息框会显示它“没有短路”。

      【讨论】:

        猜你喜欢
        • 2014-06-08
        • 2019-01-05
        • 2016-08-21
        • 2014-08-09
        • 2011-05-10
        • 2023-03-10
        • 1970-01-01
        • 2010-12-13
        • 2012-01-01
        相关资源
        最近更新 更多