当前位置:  开发笔记 > 编程语言 > 正文

C#null-coalescing(??)运算符的运算符优先级是什么?

如何解决《C#null-coalescing(??)运算符的运算符优先级是什么?》经验,为你挑选了3个好方法。

我刚试过以下内容,想法是连接两个字符串,用空字符串替换空值.

string a="Hello";
string b=" World";

- 调试(有趣的是?是打印,并不完全有助于提高可读性......)

 ? a ?? "" + b ?? "" 

- >"你好"

正确的是:

? (a??"")+(b??"")
"Hello World"

我有点期待"Hello World",或者只是"世界",如果a为null.显然这是运算符优先级的todo,可以通过括号来克服,是否存在记录此新运算符的优先顺序的任何位置.

(意识到我应该使用stringbuilder或String.Concat)

谢谢.



1> Jon Skeet..:

除了你有什么喜欢的优先级是,它是根据ECMA,它是根据MS规格,什么CSC实际上并,我有意见的一位:

不要这样做.

我认为写起来清楚得多:

string c = (a ?? "") + (b ?? "");

或者,假设字符串连接中的null最终只是一个空字符串,只需写:

string c = a + b;

编辑:关于记录的优先级,在C#3.0规范(Word文档)和ECMA-334中,加法绑定比绑定更严格,绑定比绑定更紧密.另一个答案中给出的MSDN链接是错误的,奇怪的,IMO.2008年7月页面上显示的更改移动了条件运算符 - 但显然不正确!


有趣的是:string s = null将s赋值为null而string s = null + null将s赋给""
对于"不要这样做",+1还不够.
尝试这样的事情很有趣:int?a = 4; 诠释?b = 5;int结果= a ?? 0 + b ?? 0; 结果如何?9?不!是4!当a不为null时,结果仅为a。如果要得到9,则必须执行以下操作:int result =(a ?? 0)+(b ?? 0); 因此,在这些情况下,请始终使用括号。

2> Sam Meldrum..:

MSDN上记录了运算符优先级.

但是,MSDN的优先级与微软的可下载C#规范和ECMA 规范的优先级相矛盾.这有点奇怪.

无论如何,正如Jon Skeet在他的回答中所说,最好不要依赖运算符的优先级,而是通过使用括号来明确.



3> Garry Shutle..:

永远不要依赖运营商优先权.始终明确指定您希望代码的行为方式.当你回到你的代码时,请帮助自己和他人.

(a ?? "") + (b ?? "")

这没有留下任何歧义的余地.歧义是臭虫的滋生地.


定义"何时重要" - 您是否也将它用于+ b*c?即使你认为这太模糊,我怀疑有些例子我可以找到它重要的但是*每个人都认为这很明显.我同意一般的想法,但不是你走了多远:)
好的,这是一个例子 - 你总是支持关联性和优先级吗?其中一件好事?是你可以写"a ?? b ?? c ?? d".鉴于这是一个相当惯用的用途,我认为它比一个更清楚?(b ??(c ?? d)).但诚然,这不是优先权:)
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有