什么是问号和点运算符? 是指在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;否则,求第二个操作数(作为第一个操作数的成员访问)。

在你的例子中,重点是如果anull ,那么a?.PropertyOfA将计算为null而不是抛出一个exception – 然后它将比较该null引用与foo (使用string的==重载),发现它们不是平等和执行将进入if语句的主体。

换句话说,就是这样的:

 string bar = (a == null ? null : a.PropertyOfA); if (bar != foo) { ... } 

…除了a只评估一次。

请注意,这也可以改变expression式的types。 例如,考虑FileInfo.Length 。 这是longtypes的一个属性,但是如果将它与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