从编译后的角度(而不是编码语法的角度)来看,在 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/