如何解决通用类型的无用拳击
此示例代码的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 举报,一经查实,本站将立刻删除。