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

时间:2015-02-05 19:09:58

标签: c# operators 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
}

它到底是做什么的?

3 个答案:

答案 0 :(得分:378)

这是null conditional运营商。它基本上意味着:

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

在您的示例中,重点是如果anull,那么a?.PropertyOfA将评估为null而不是抛出异常 - 然后它会比较null {1}}引用foo(使用字符串的==重载),发现它们不相等,执行将进入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

答案 1 :(得分:60)

在展平层次结构和/或映射对象时非常有用。而不是:

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 Working Example

?? or null-coalescing operator? or null conditional operator不同。

它也可以在Action的赋值运算符一侧使用。而不是

Action<TValue> myAction = null;

if (myAction != null)
{
  myAction(TValue);
}

可以简化为:

myAction?.Invoke(TValue);

DotNetFiddle Example

使用System;

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

答案 2 :(得分:2)

这对C#来说相对较新,这使我们可以轻松地在方法链中调用与 null或非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