在(someDelegateName)?.Invoke();中,"?"的作用是什么?

10
以下代码片段在Visual Studio中进行了突出显示,并提出了简化建议。
if ( drawMethodsDelegate != null )
    drawMethodsDelegate ( e.Graphics );

当我点击灯泡建议时,Visual Studio将其重构为以下内容。
drawMethodsDelegate?.Invoke ( e.Graphics );

不,问号不是笔误。我不明白问号的用途,并且在MSDN上找不到相关信息。我也查看了Tutorial Point委托页面,但没有找到有用的信息。

Tutorial Point页面MSDN委托页面MSDN Control.Invoke页面


搜索:C# 空值条件运算符 - George Vovos
这是C# 6的一个特性:Null-Conditional Operator - Jeroen van Langen
2个回答

22

这是空值条件运算符。

drawMethodsDelegate?.Invoke ( e.Graphics );

drawMethodsDelegate不为空的情况下,调用Invoke方法。这是C#第六版引入的一种运算符,你可以将其看作一个语法糖,它帮助你编写更少的代码来处理空检查。

最后但并非最不重要的是,上述检查也是线程安全的!

欲了解更多信息,请参见此处


1
我喜欢你的回答,因为它提供了不止最基本的信息。但我不明白为什么这个问题会被踩。 - James Yeoman
1
@JamesYeoman 谢谢!不幸的是,在我们的社区中,有这样的行为,没有评论就进行了负评。我认为你的问题不应该被负评。实际上,在开始写这个评论之前,我已经给它点了赞。我希望有一天所有的负评都能够附带理由。 - Christos
踩票很可能是因为答案很容易在谷歌上搜索到,如果你将光标悬停在踩票图标上,会显示“这个问题没有显示任何研究努力”。 - DavidG
@DavidG 你说得有道理,关于谷歌搜索。然而,在这种情况下,我坚信你应该投票关闭问题并留下评论。我认为不带评论就进行负投票不是一个好的做法。 - Christos
@JamesYeoman 这不是智力问题,而是尊重问题。我个人的观点是,没有评论的负评是不尊重的。它对任何人都没有帮助。 - Christos
显示剩余8条评论

3

1
这是一种语言特性(C#6.0),而不是.NET特性(4.6)。C#4.6不存在。 - Jeroen van Langen
你说得对。抱歉。 - Stralos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接