我刚刚发现了这种语法:
date1 = date2?.ToString("yyyy-MM-dd") ?? date3;
当然,这是我第一次看到这样的语法,我不理解它。经过调试,我明白它相当于:
if(date2 != null)
date1 = date2.ToString("yyyy-MM-dd");
else
date1 = date3;
我的问题是:为什么引入这种语法,因为它根本不易读,它只是节省了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 运算符。