-1

我想知道这是否曾经或仍然是.Net中的一个案例。

使用 exp += val 而不是 exp = exp + val。由于 exp 可以任意复杂,这可能会导致大量不必要的工作。这会强制 JIT 评估 exp 的两个副本,而且很多时候这不是必需的。第一条语句的优化比第二条要好得多,因为 JIT 可以避免两次评估 exp。

那来自codeproject中的一篇古老的文章。

cpp中还有一个:

但是,复合赋值表达式不等价于扩展版本,因为复合赋值表达式仅对 expression1 求值一次,而扩展版本对 expression1 求值两次:在加法运算和赋值运算中。

4

1 回答 1

2

是的,它曾经是,现在仍然是 .NET 中的最佳实践。要添加 4 的图像

myObject.MyExpensiveMethod().MyProperty

显然你不想这样做:

myObject.MyExpensiveMethod().MyProperty = 
    myObject.MyExpensiveMethod().MyProperty + 4;

因为它调用了两次昂贵的方法,而+=只调用了一次。你可以这样做:

var temp = myObject.MyExpensiveMethod();
temp.MyProperty = temp.MyProperty + 4;

便宜,但它最便宜:

myObject.MyExpensiveMethod().MyProperty += 4;

由于昂贵的方法只被调用一次。

另一种情况是当您使用具有副作用的方法时,您只想调用一次:

myFactory.GetNextObject().MyProperty += 5;

你_当然不会

myFactory.GetNextObject().MyProperty = myFactory.GetNextObject().MyProperty + 5;

您可以再次使用临时变量,但复合赋值运算符显然更简洁。

诚然,这些都是边缘情况,但这并不是一个坏习惯。

于 2020-08-17T21:50:33.310 回答