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不存在。
- 你说得对。我很抱歉。