首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是问号和点运算符?在C# 6.0中是什么意思?

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

Stack Overflow用户
提问于 2015-02-06 03:09:58
回答 3查看 343.2K关注 0票数 457

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

代码语言:javascript
复制
public class A {
   string PropertyOfA { get; set; }
}

...

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

它到底是做什么的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-06 03:12:35

这是运算符。它的基本意思是:

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

在您的示例中,要点是如果anull,那么a?.PropertyOfA将计算结果为null,而不是抛出异常-然后它将null引用与foo (使用字符串的==重载)进行比较,发现它们不相等,执行将进入if语句体。

换句话说,它是这样的:

代码语言:javascript
复制
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
    ...
}

..。除了a只评估一次。

请注意,这也可以更改表达式的类型。例如,考虑FileInfo.Length。这是一个long类型的属性,但是如果将其与null条件运算符一起使用,则会得到一个long?类型的表达式

代码语言:javascript
复制
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
票数 638
EN

Stack Overflow用户

发布于 2016-08-12 00:57:48

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

代码语言:javascript
复制
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;
}

它可以写成这样(逻辑与上面相同)

代码语言:javascript
复制
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";

DotNetFiddle.Net Working Example

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

它也可以在赋值运算符之外与Action一起使用。而不是

代码语言:javascript
复制
Action<TValue> myAction = null;

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

它可以简化为:

代码语言:javascript
复制
myAction?.Invoke(TValue);

DotNetFiddle Example

使用系统;

代码语言:javascript
复制
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基本上,我已经申请了?模型之后的运算符。我想知道它是否可以直接应用于模型,还是只适用于导航属性?

左边的? or null conditional operator运算符表示值,而不考虑值的类型。编译器并不关心右边的值是什么。这是一个简单的编译器魔法(这意味着它可以做一些你已经可以做的事情,只是简单地解释一下为什么)。

例如

代码语言:javascript
复制
  var a = model?.Value;

等同于说

代码语言:javascript
复制
  var a = model == null ? null : model.Value;

在第二种情况下,检查null的评估与返回的值没有关联。如果左边的值为null,null条件运算符基本上总是返回null。

成员(方法、字段、属性、构造函数) .Value的类型是无关的。

您的DotNetFiddle示例不起作用的原因是用于.Net 4.7.2的编译器与支持null条件运算符的c#版本不兼容。将其更改为.Net 5,效果如下:

https://dotnetfiddle.net/7EWoO5

票数 101
EN

Stack Overflow用户

发布于 2018-05-04 14:11:40

这对于C#来说是相对较新的,这使得我们可以很容易地在方法链接中调用与null或非NULL值相关的函数。

实现同样目标的旧方法是:

代码语言:javascript
复制
var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

现在,只需使用以下命令,它就变得更加容易:

代码语言:javascript
复制
member?.someFunction(var someParam);

我强烈推荐this doc page

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28352072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档