首页 > 解决方案 > 泛型类型的无用装箱

问题描述

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这里需要?

标签: c#cilboxing

解决方案


装箱是必需的,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 

推荐阅读