c# - 泛型类型的无用装箱
问题描述
此TestMethod
示例代码的
public class Test<T> where T : class
{
public void TestMethod(T param)
{
PrivateMethod(param);
}
private void PrivateMethod(object obj)
{
}
}
编译成这个 IL 代码:
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: box !T
IL_0007: call instance void class SensorPositioner2.Test`1<!T>::PrivateMethod(object)
IL_000c: ret
正如我看到的指令,在调用box
过程中会创建一个新对象吗?TestMethod
如果是这样,我该如何避免这种情况?如果不是,为什么box
这里需要?
解决方案
装箱是必需的,object
因为PrivateMethod()
. 您可以更改 PrivateMethod 的签名以使用通用类型而不是对象以避免装箱。
private void PrivateMethod(T obj)
{
}
这将转化为
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: call UserQuery+Test<>.PrivateMethod // Your method
IL_0008: nop
IL_0009: ret
推荐阅读
- css - 移动设备中的 Bootstrap 3.3 按钮 css 文本中断
- javascript - 当 JSON 成功返回少于指定数量的项目时如何隐藏元素
- java - CRUD Android 工作室
- java - java gui方法/对象调用
- php - 以管理员顺序显示 Woocommerce 自定义结帐字段值,使其可编辑
- mysql - MySQL:查找一条记录的行号并使用 LIMIT 选择 -50+50 条记录
- python - 参考 x 列中的特定元素替换 y 列中的特定元素
- bokeh - 在 ColumnDataSource 的颜色和映射器的颜色之间进行散景切换
- scala - 为什么在 Maven Surefire 中指定 Xss 会使 ScalaTest 运行速度提高一倍?
- r - R - 在循环内循环