奇怪的C#语法

时间:2017-07-03 10:36:30

标签: c# conditional-statements

我刚刚发现了这种语法:

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

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

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

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

编辑:我的问题是关于?算子,不是??

3 个答案:

答案 0 :(得分:11)

该声明不仅可以节省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);
                               }
                         );

第一个更具表现力和强大力量。如果你有多个房产怎么办?

答案 1 :(得分:2)

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

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

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

因此它可能比你想象的要复杂一些。

答案 2 :(得分:1)

此类语法是在C#6.0中新增的。 $scope.html="<--some html content--> <img class='some-class' src='http://www.example.com/img/test.jpg'> <--some other html content-->" 被称为 null-conditional 。 这个microsoft article描述了C#6.0的所有新增功能,并且还列出了这个新的 null-conditional 运算符。