关于c#:(someDelegateName)中“?”的目的是什么?。Invoke();?

What is the purpose of “?” in (someDelegateName)?.Invoke();?

本问题已经有最佳答案,请猛点这里访问。

下面的代码片段在Visual Studio中突出显示,并建议简化它。

1
2
if ( drawMethodsDelegate != null )
    drawMethodsDelegate ( e.Graphics );

当我单击灯泡建议时,Visual Studio将其重构为以下内容

1
drawMethodsDelegate?.Invoke ( e.Graphics );

不,问号不是打字错误。我不明白问号是用来做什么的,我也找不到任何与msdn相关的东西。我还查看了Tutorial Point Delegates页面,但没有找到有用的信息。

教程点页,msdn委托页,msdn控件.invoke页

  • 搜索:C空条件运算符
  • 这是C 6特性:空条件运算符


这是空条件运算符。

1
drawMethodsDelegate?.Invoke ( e.Graphics );

如果drawMethodsDelegate不为空,则调用Invoke方法。它是在第6版C中引入的一个运算符,您可以将其视为一种语法糖分,它可以帮助您编写更少的代码来处理空检查。

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

更多信息请看这里

  • 我喜欢你的答案,因为它提供的不仅仅是最基本的信息。我不明白为什么这个问题会被否决
  • @詹姆斯约曼谢谢你!不幸的是,在我们的社区里,我们有这样的行为,没有任何评论。我不认为你的问题应该被否决。实际上,在开始写这篇评论之前,我投了反对票。我希望总有一天,所有的不投票都要有理由。
  • 向下投票可能是因为谷歌很容易找到答案,如果你将鼠标悬停在向下投票箭头上,它会说"这个问题没有显示出任何研究成果"。
  • @大卫,你说得对,关于谷歌。不过,我强烈相信,在这种情况下,你应该投票结束这个问题,并发表评论。我不认为这是一个好的做法。
  • @老实说,克丽丝托斯,在任何社区里,都有不那么容易理解的人。例如,御宅族文化/社区中的小袋鼠。不管怎样,再等3分钟,我才能把接受的答案标出来。
  • @克里斯托斯不加评论地投了反对票,这是在座各位的一项基本权利,决不能剥夺。
  • @尽管在我尝试的网站链接中有研究工作的证据…
  • @詹姆斯约曼,这不是智力问题。这是尊重的问题。我个人认为,投反对票而不发表评论是不尊重的。这对任何人都没有帮助。
  • @詹姆斯约曼,但如果你在谷歌上搜索的话,你很可能会找到答案。
  • @直到问题的答案出现,我才知道这个空条件运算符。
  • @Jamesyeoman当然你不知道某个功能的名称,但是去搜索"C问号"例如,我打赌你的一个顶级链接会回答这个问题。
  • @戴维格,当时我没想到会有这样的搜索…我认为这可能是一个代表性的事情,因为我从来没有见过它甚至建议过…顺便说一句,我并不是想变得学究或其他什么,但有用的链接是第三个结果。前两个是关于有条件的lambda(或者不管它们的技术术语是什么),这是有意义的,因为它们更常见。
  • @我认为第三个链接可以被归类为"顶级链接之一"。这正是我结束这个问题的原因。


这是C 6.0附带的空条件运算符

https://msdn.microsoft.com/en-us/library/dn986595.aspx

这意味着如果drawmethodsDelegate不是空的,则调用该方法,否则不执行任何操作。

  • 它是一种语言功能(C 6.0),而不是.NET功能(4.6)。C 4.6不存在。
  • 你说得对。我很抱歉。