【发布时间】:2020-12-07 01:03:48
【问题描述】:
我想知道 .Net 中是否曾经或现在仍然是这种情况。
使用 exp += val 代替 exp = exp + val。由于 exp 可以是 任意复杂,这可能会导致大量不必要的工作。这 强制 JIT 评估 exp 的两个副本,很多时候这是 并不需要。第一条语句可以优化得比 其次,因为 JIT 可以避免两次评估 exp。
这来自 codeproject 中的一篇古老的文章。
cpp中还有一个:
但是,复合赋值表达式并不等同于 扩展版本,因为复合赋值表达式计算 expression1 只有一次,而扩展版本计算 expression1 两次:在加法运算中和在赋值中 操作。
【问题讨论】:
-
我认为这可能是指在
int属性上使用+=而不是本地或字段。 -
你有codeproject文章的链接或wayback-machine副本吗?我想知道作者是谁,因为从历史上看,有很多非专家在 CodeProject 上宣称完全不正确的信息。 C# 规范是怎么说的?
-
@Dai,我在 c# 规范中找不到
-
我认为这需要一个语言标签,因为
+=是 C# 和 VB.NET 中的运算符。 C# documentation 表示“x += y等同于x = x + y,除了x只评估一次”,但我不明白分配给x需要如何评估它(再次)。也许这只是做collection[index] += value或SomeObject.SomeMethod().SomeProperty += value之类的优化;否则,它只是简写。
标签: c# .net optimization language-lawyer compound-assignment