微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通用类型的无用拳击

如何解决通用类型的无用拳击

此示例代码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的签名更改为使用Generic Type而不是object以避免装箱。

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 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。