什么是问号和点运算符?是什么意思在C#6.0?

有了C#6.0在VS2015预览我们有一个新的运算符,?。,可以这样使用:

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

它究竟做了什么?

它是null conditional运算符。它基本上意味着:

“评估第一个操作数;如果它为null,停止,结果为null。否则,计算第二个操作数(作为第一个操作数的成员访问)。

在你的例子中,关键是如果a是null,那么一个?.PropertyOfA将求值为null,而不是抛出一个异常 – 然后它会将该空引用与foo(使用string的== overload)进行比较,发现它们不是等于和执行将进入if语句的主体。

换句话说,它是这样的:

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

…除了a只被计算一次。

注意,这也可以改变表达式的类型。例如,考虑FileInfo.Length.这是一个long类型的属性,但是如果你使用它和null条件运算符,你最终得到一个long类型的表达式:

FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
http://stackoverflow.com/questions/28352072/what-does-question-mark-and-dot-operator-mean-in-c-sharp-6-0

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:什么是问号和点运算符?是什么意思在C#6.0?