什么是问号和点运算符? 是指在C#6.0中?
在VS2015预览版的C#6.0中,我们有一个新的操作符?.
,可以这样使用:
public class A { string PropertyOfA { get; set; } } ... var a = new A(); var foo = "bar"; if(a?.PropertyOfA != foo) { //somecode }
它究竟做了什么?
这是空的条件运算符。 它基本上意味着:
“评估第一个操作数,如果是null,则停止,结果为null;否则,求第二个操作数(作为第一个操作数的成员访问)。
在你的例子中,重点是如果a
为null
,那么a?.PropertyOfA
将计算为null
而不是抛出一个exception – 然后它将比较该null
引用与foo
(使用string的==
重载),发现它们不是平等和执行将进入if
语句的主体。
换句话说,就是这样的:
string bar = (a == null ? null : a.PropertyOfA); if (bar != foo) { ... }
…除了a
只评估一次。
请注意,这也可以改变expression式的types。 例如,考虑FileInfo.Length
。 这是long
types的一个属性,但是如果将它与null条件运算符一起使用,则最终会得到long?
types的expression式long?
:
FileInfo fi = ...; // fi could be null long? length = fi?.Length; // If fi is null, length will be null
在展开层次结构和/或映射对象时,它可能非常有用。 代替:
if (Model.Model2 == null || Model.Model2.Model3 == null || Model.Model2.Model3.Model4 == null) { mapped.Name = "N/A" } else { mapped.Name = Model.Model2.Model3.Model4.Name; }
它可以像(与上述相同的逻辑)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
DotNetFiddle.Net工作示例 。
另一种可用于内联if语句的方法是:
lblDueDate.Text = assignment.DueDate == null ? "" : (assignment.DueDate.Value.ToShortDateString());
产量
lblDueDate = 12/21/2021
代替:
if(assignment.DueDate == null) { lblDueDate.Text = ""; } else { lblDueDate.Text = assignment.DueDate.ToShortDateString(); }
仅供参考.ToShortDateString()
只是.ToShortDateString()
了返回的DateTime
值结束时的烦人时间。 而不是有12/21/2021 05:20:00.655