【问题标题】:Weird C# syntax奇怪的 C# 语法
【发布时间】:2017-12-06 14:20:59
【问题描述】:

我刚刚发现了这个语法:

date1 = date2?.ToString("yyyy-MM-dd") ?? date3;

当然,我第一次看到这样的语法,我不明白。经过调试,我明白是相当于:

if(date2 != null)
   date1 = date2.ToString("yyyy-MM-dd");
else
   date1 = date3;

我的问题是:为什么要引入这种语法,因为它根本不清晰,而且只节省了 3 行文本?

编辑:我的问题是关于 ?运算符,而不是 ??

【问题讨论】:

  • 我猜新语法更容易理解
  • 是 C# 6.0 语法
  • 这只是需要时间来理解,它会更容易阅读
  • 你指的是哪一种语法? ?. 运算符或???
  • 它只是一个语法糖。让我们这些懒惰的程序员少写几行代码。

标签: c# conditional-statements


【解决方案1】:

该语句不仅节省了 3 行代码,而且更具可读性,还节省了代码块,这对于允许更复杂的 LINQ 查询很重要。

你觉得这两个怎么样?

var x = collection.Select(x => new SomeClass(x?.Property ?? "default"));

反对:

var x = collection.Select(x => 
                               {
                                   string value = null;
                                   if (x != null)
                                   {
                                       value = x.Property;
                                   }

                                   if (value == null)
                                   {
                                       value = "default";
                                   }

                                   return new SomeClass(value);
                               }
                         );

第一个更具表现力和强大。如果您拥有多个财产怎么办?

【讨论】:

  • 在访问.Property之前,x?.Property不是先确认x不为空,以免出现空引用异常吗?
  • @Forty3 是的。
【解决方案2】:

他们引入?. 运算符的原因与引入?? 运算符的原因相同:以缩短代码。您针对?. 提出的相同论点可以针对?? 提出(并且在较小程度上可以针对三元运算符? : 提出)。但最后我认为它很有用(就像我认为它对三元运算符 ? : 有用一样)。如果您知道它的含义,它是可读的。如果您不知道这意味着任何运算符是不可读的。

这很有用,因为您编写的代码仅在 date2 是字段/局部变量/参数时才是正确的...如果它是属性,则可以保证不会读取该属性两次(某事这可能非常重要,具体取决于参数的计算方式)。代码更改为:

DateTime? temp = date2;
string date1 = temp != null ? temp.GetValueOrDefault().ToString("yyyy-MM-dd") : date3;

所以它可能比你想象的要复杂一些。

【讨论】:

    【解决方案3】:

    这种类型的语法是在 C# 6.0 中新添加的。 ?. 被称为 null-conditional。 此microsoft article 描述了 C# 6.0 的所有新增功能,还列出了此新的 null-conditional 运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 2012-03-14
      • 2012-12-17
      • 2012-10-12
      • 2010-11-24
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多