c# - 如果所有这些操作无论如何都必须发生,那么在一行中编写一组操作有什么好处吗?

标签 c# optimization compiler-construction coding-style

从编译后的角度(而不是编码语法的角度)来看,在 C# 中,在一行上发生的一组操作与在多行上发生的一组操作之间的编译代码是否存在任何实际差异线条?

这个

object anObject = new object();
anObject = this.FindName("rec"+keyPlayed.ToString());
Rectangle aRectangle = new Rectangle();
aRectangle = (Rectangle)anObject;

对比这个。

Rectangle aRectangle = (Rectangle)this.FindName("rec"+keyPlayed.ToString());

我想知道,因为似乎有一种观点认为使用的线路数量越少越好,但我想了解这是因为有切实的技术利益,还是在某个时候有切实的利益,或者是否确实是出于可量化的原因?

最佳答案

行数无关紧要;如果代码是等效的(你的不是),IL 将是相同的。

实际上,除非我们知道 FindName 返回什么,否则我们无法正确回答 - 因为通过转换为 object 您可能会引入“框”操作,并且您可能正在将一个转换操作(或者可能是一个被动的无操作转换)更改为一个主动的双重转换(转换为object,转换为Rectangle)。现在,为简单起见,我假设 FindName 返回 object。如果您使用了 var,我们一眼就能知道您的代码没有更改类型(box/cast/等):

var anObject = this.FindName("rec"+keyPlayed.ToString());

在 Release模式(启用优化)下,编译器将删除大多数已设置并立即使用的变量。上面两行之间最大的区别是第二个版本不创建和丢弃 new object()new Rectangle()。但如果您没有这样做,代码将是等效的(同样,假设 FindName 返回 object):

object anObject;
anObject = this.FindName("rec"+keyPlayed.ToString());
Rectangle aRectangle;
aRectangle = (Rectangle)anObject;

如果您重新使用该变量(在这种情况下它不一定会被编译器删除),并且如果该变量被 lambda/anon 方法“捕获”,或者在 引用/输出。如果编译器/JIT 选择纯粹在寄存器中执行操作而不将其复制回变量(寄存器具有不同(更大)的宽度,即使是“固定大小”的数学,如 float )。

关于c# - 如果所有这些操作无论如何都必须发生,那么在一行中编写一组操作有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327124/

相关文章:

python - 如何运行 hyperopt 教程示例

optimization - 如何优化重载if语句的Dart代码?

c++ - 编译器会排除未使用的模板代码吗?

java - Eclipse 的 ecj 编译器可扩展吗?

c# - Unity C# 脚本中未调用重写虚函数

c# - 有哪些方法可以动态获取 DateTime.Now.AddDays(0..7) 的列表?

c# - 为什么当我尝试在列表中查找 .IndexOf(a) 时返回 -1?

C - 在什么情况下外部声明成为定义?

c# - Mono 中的 NameResolutionFailure 而不是 .NET

c# - 检查 argumentSyntax 是否可以通过具有 IParameterSymbol 的方法调用