Seb*_*ray 1 c# compiler-construction optimization coding-style
从编译后的角度(而不是编码语法的角度来看),在C#中,在一行中发生的一组操作与多行中发生的一组操作之间的编译代码是否存在实际差异?
这个
object anObject = new object();
anObject = this.FindName("rec"+keyPlayed.ToString());
Rectangle aRectangle = new Rectangle();
aRectangle = (Rectangle)anObject;
Run Code Online (Sandbox Code Playgroud)
vs这个.
Rectangle aRectangle = (Rectangle)this.FindName("rec"+keyPlayed.ToString());
Run Code Online (Sandbox Code Playgroud)
我想知道,因为似乎有一种观点认为使用的线路数量最少,但是我想了解这是因为有一个切实的技术效益,或者是否在某些方面带来了实实在在的利益,或者是否确实存在一个可量化的原因?
线的数量无关紧要; 如果代码是等价的,那么IL将是相同的(你的不是).
实际上,除非我们知道什么FindName返回,否则我们无法正确回答 - 因为通过强制转换object你可能会引入一个"盒子"操作,并且你可能正在将转换操作(或者可能是被动的无操作转换)转换为主动双播(施放object,施法Rectangle).就目前而言,为简单起见,我会假设FindName返回object.如果你使用过var,我们一眼就知道你的代码没有改变类型(box/cast/etc):
var anObject = this.FindName("rec"+keyPlayed.ToString());
Run Code Online (Sandbox Code Playgroud)
在发布模式下(启用了优化),编译器将删除大多数已设置的变量,然后立即使用.上述两条线之间的最大区别在于第二个版本不会创建并丢弃new object()和new Rectangle().但是如果你没有这样做,那么代码将是等价的(再次假设FindName返回object):
object anObject;
anObject = this.FindName("rec"+keyPlayed.ToString());
Rectangle aRectangle;
aRectangle = (Rectangle)anObject;
Run Code Online (Sandbox Code Playgroud)
如果重新使用变量(在这种情况下它不一定被编译器删除),并且如果该变量被lambda/anon方法"捕获",或者在ref/中使用,则存在一些细微之处out.如果编译器/ JIT选择仅在寄存器中执行操作而不将其复制回变量(寄存器具有不同(更大)宽度,即使对于"固定大小"数学运算float),也会对某些数学场景进行一些细微处理.
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |