![]() |
1
2
我想通了!幸运的是,我读到了
这样做的缺点是,装箱会导致装箱对象的内存分配,因此它比使用局部变量(已经分配)慢一点。但是,它使您不必确定、声明和引用所需的所有局部变量。 |
![]() |
2
2
如果变量已经在堆栈上,则可以继续执行并发出方法调用。 构造函数似乎没有以类型化的形式将变量推送到堆栈上。在深入研究IL后,似乎有两种方法可以在构造变量后使用它。 您可以在调用构造函数之前将存储引用的变量加载到计算堆栈上,然后在调用构造函数后再次加载该变量,如下所示:
另一种选择是按照你所展示的方式去做。我能看到的唯一原因是ctor方法返回void,所以它们不像其他方法那样将值放在堆栈上。如果新对象不在堆栈上,您可以调用Setloc,这确实看起来很奇怪。 |
![]() |
3
1
在仔细考虑了这些选择之后,我认为你认为这是不可能的。如果检查MSIL指令的堆栈行为,可以看到没有操作将其操作数留在堆栈上。由于这将是“获取堆栈条目的地址”操作的要求,我相当有信心不存在这样的操作。 这就剩下了dup+box或stloc+ldloca。正如你所指出的,后者可能更有效。 @格雷格:许多指令都会留下 后果 在堆栈上,但没有留下任何指令 操作数 在堆栈上,这是“获取堆栈元素地址”指令所必需的。 |
![]() |
4
0
刚刚写了一个类,它做了OP要求的事情。..这是C#编译器生成的IL代码:
|