【问题标题】:Shorthand for create new instance if null?如果为空,则创建新实例的简写?
【发布时间】:2013-06-06 14:02:49
【问题描述】:

在 Javascript 中我可以这样做:

var myVar = returnNull() || new MyObject();

在 C# 中,我目前正在这样做:

var myVar = returnObjectOrNull();

if (myVar == null) myVar = new MyObject();

有没有办法在 C# 中缩短它?

【问题讨论】:

    标签: c#


    【解决方案1】:

    使用?? 运算符

    foo ?? new Foo();
    

    或者在你的情况下

    var myVar = returnObjectOrNull() ?? new MyObject();
    

    ??运算符称为空合并运算符,用于 为可空值类型或引用类型定义默认值。它 如果操作数不为空,则返回左侧操作数;否则它 返回右操作数。

    【讨论】:

      【解决方案2】:

      使用空合并运算符

      var myVar = returnObjectOrNull();
      
      myVar = myVar ?? new MyObject();
      

      【讨论】:

        【解决方案3】:

        使用null-coalescing operator

        var myvar = returnObjectOrNull() ?? new MyObject();
        

        【讨论】:

          【解决方案4】:

          是的,它叫做null coalescing operator

          var myVar = returnObjectOrNull() ?? new MyObject();
          

          请注意,如果左侧不为 null,则此运算符不会计算右侧,这意味着上面的代码行不会创建新的 MyObject,除非它必须这样做。

          这是一个示例LINQPad 程序来演示:

          void Main()
          {
              var myVar = returnObjectOrNull() ?? new MyObject();
          }
          
          public MyObject returnObjectOrNull()
          {
              return new MyObject();
          }
          
          public class MyObject
          {
              public MyObject()
              {
                  Debug.WriteLine("MyObject created");
              }
          }
          

          这将输出一次“MyObject created”,这意味着在 returnObjectOrNull 方法中只创建了一个对象,而不是 ?? 语句行中的那个。

          【讨论】:

            【解决方案5】:

            你可以使用?? Operator (C# Reference)这样的操作符;

            var myVar = returnObjectOrNull() ?? new MyObject();
            

            ?? 运算符称为空合并运算符,用于 为可空值类型或引用类型定义默认值。它 如果操作数不为空,则返回左侧操作数;否则它 返回右操作数。

            【讨论】:

            • 大声笑每个人都有相同的答案!就像你们都复制并粘贴然后提交您自己的答案一样。
            • 只有一个答案,所以每个人的答案几乎都一样也就不足为奇了。
            • @PatrickMagee 其实这太正常了。这是一个基本问题,所有答案都有紧密的时间戳。像这个问题stackoverflow.com/questions/6201734/…在Stackoverflow里太正常了。
            • 我知道,我知道,但是当我刷新每个人都有相同的变量名和所有东西时,这很有趣 xD
            • 我想大家只是修改了问题中的例子。
            猜你喜欢
            • 1970-01-01
            • 2019-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-08
            • 1970-01-01
            相关资源
            最近更新 更多