我经常发现自己在做:
foo = foo ?? x;
为什么我不能这样做:
foo ??= x;
编辑:我知道这不是语言的一部分......我的问题是"为什么不"?我发现重复"foo"的必要性令人不愉快并且可能容易出错.它看起来像丑陋一样:
foo = foo + x;
Brian Genisi.. 19
当我想到它时,
foo = foo ?? x
真是公正
foo = foo != null ? foo : x
在这一点上,+ =的类比开始分崩离析.
当我想到它时,
foo = foo ?? x
真是公正
foo = foo != null ? foo : x
在这一点上,+ =的类比开始分崩离析.
没有理由不能有这样的操作员,但我怀疑语言的复杂程度虽然微不足道,但却超出了利益(我认为"非常轻微").
基本上任何语言的添加都有很高的清晰度.你说你经常使用它 - 多久一次,真的吗?虽然我认为??
方便,但我不能说我甚至经常使用它.
通常,C#语言设计团队对添加新语法是保守的.他们说,必须权衡语言增加的价值与语言复杂性增加的代价.
Peter Hallam曾担任C#编译器开发主管一段时间,也是C#语言设计团队的成员.他写了一篇关于测量新功能的方法,称为Yardstick,尽管他更关注交互式GUI功能而不是语言功能.
本文与以下问题特别相关??=
:
通常,正确的设计决策是不改变任何东西.这可能是我在C#语言设计会议上观看Anders时学到的最重要的一课.通常会提出一种语言领域,其中可能会产生一些真正的收益.我们可以防止用户出现常见的编码错误,或者我们可以提高某个问题域的语言可用性.然后经过深思熟虑后,通过解决问题的所有选项,答案就是......没事!即使问题是有效的,看起来我们应该能够添加一些东西来改善这种情况,但经过仔细的反思后,没有办法解决不超过解决方案收益的问题.我见过Anders所做的许多最重要和最有价值的决定都是决定不增加语言的复杂性,除非增加的价值证明了复杂性.在边缘情况下,他几乎总是选择添加一些边缘的东西.
码尺
程序员真正做了什么?
??
它不是"操作符",因为它使用操作数的值进行"操作".您应该将其视为语言构造.
假设你有:
node = node.next;
那么您是否希望能够执行以下操作?
node .= next;
我认为??=
不存在的原因.=
与不存在的原因相同.
此外,一元运算符一样+=
,*=
等有在装配水平直接对口.伪汇编:
add reg0, 1 mul reg1, 5
这些运营商的存在只是"自然".
没有操作员执行此操作.但是,对于该语言的未来版本,这是一个有趣的建议.我怀疑它到目前为止还没有被包括在内,因为合并运算符的主要用例??
是Nullable类型,并获得如下值:
int? testValue; return testValue ?? 0;
而不是像你的例子那样的赋值操作.此外,虽然+=
保证在所有情况下都修改foo的值,但是+= 0
,??=
不会.
还有,在讨论的比喻是否一个更简单的答案大家都在丢失??=
到+=
有道理.
问:你为什么不能foo ??= x;
用C#做什么?
答:因为每个功能都以负100分开始,所以功能开始不存在,有人必须让它们发生,并且如果他们添加了这个功能,那么这些资源最多可能用于对客户群有更大利益的事情:
...想一想设计功能应该如何工作所需的所有时间和精力,确定所有边界条件,然后对其进行编码,为其编写自动化测试,...编写文档和帮助文本,并继续维护功能预期寿命的代码,测试和文档(在这种情况下可能是永久的).是否所有这些资源都花在了对客户群有更大利益的事情上?(对此的回答总是"是" - 每个人和她的嫂子都可以找到一种方法来完成这句话,"我不敢相信他们一直在浪费这个愚蠢的特征而不是修复......" )