问号和点运算符是什么? 意味着在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
而不是抛出异常 - 然后它将比较该null
引用与foo
(使用字符串的==
过载),发现它们不是平等和执行将进入if
语句的主体。
换句话说,就是这样的:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
...除了a
只评估一次。
请注意,这也可以更改表达式的类型。 例如,考虑FileInfo.Length
。 这是一个long
类型的属性,但是如果将它与null条件运算符一起使用,则最终会得到一个long?
类型的表达式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
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
它可以像(与上述相同的逻辑)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
DotNetFiddle.Net工作示例。
它也可以在赋值运算符的外侧用Action。 代替
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
它可以简化为:
myAction?.Invoke(TValue);
DotNetFiddle示例:
使用系统;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
结果:
测试2
这对于C#来说是比较新的,这使得我们可以很容易地调用方法链中null或non-null值的函数。
老办法实现同样的事情是:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
现在它已经变得更容易,只是:
member?.someFunction(var someParam);
我强烈建议你在这里阅读它:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
链接地址: http://www.djcxy.com/p/53863.html上一篇: What does question mark and dot operator ?. mean in C# 6.0?