什么是问号和点运算符? 是指在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 。 这是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