为什么带有T:类约束的通用方法会导致装箱? [英] Why does generic method with constraint of T: class result in boxing?

查看:80
本文介绍了为什么带有T:类约束的通用方法会导致装箱?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么将T约束为类的通用方法在生成的MSIL代码中会有装箱指令?

Why a generic method which constrains T to class would have boxing instructions in the generates MSIL code?

对此我感到非常惊讶,因为可以肯定的是,由于T被限制为引用类型,因此生成的代码不需要执行任何装箱操作.

I was quite surprised by this since surely since T is being constrained to a reference type the generated code should not need to perform any boxing.

这是c#代码:

protected void SetRefProperty<T>(ref T propertyBackingField, T newValue) where T : class
{
    bool isDifferent = false;

    // for reference types, we use a simple reference equality check to determine
    // whether the values are 'equal'.  We do not use an equality comparer as these are often
    // unreliable indicators of equality, AND because value equivalence does NOT indicate
    // that we should share a reference type since it may be a mutable.

    if (propertyBackingField != newValue)
    {
        isDifferent = true;
    }
}

这是生成的IL:

.method family hidebysig instance void SetRefProperty<class T>(!!T& propertyBackingField, !!T newValue) cil managed
{
    .maxstack 2
    .locals init (
        [0] bool isDifferent,
        [1] bool CS$4$0000)
    L_0000: nop 
    L_0001: ldc.i4.0 
    L_0002: stloc.0 
    L_0003: ldarg.1 
    L_0004: ldobj !!T
    L_0009: box !!T
    L_000e: ldarg.2 
    L_000f: box !!T
    L_0014: ceq 
    L_0016: stloc.1 
    L_0017: ldloc.1 
    L_0018: brtrue.s L_001e
    L_001a: nop 
    L_001b: ldc.i4.1 
    L_001c: stloc.0 
    L_001d: nop 
    L_001e: ret 
}

请注意方框!! T 中的说明.

为什么会生成此信息?

如何避免这种情况?

推荐答案

您不必担心box指令的任何性能下降,因为如果它的参数是引用类型,则box指令会没有.尽管box指令甚至被创建仍然很奇怪(也许在代码生成时是懒惰/容易的设计?).

You don't have to worry about any performance-degradations from the box instruction because if its argument is a reference type, the box instruction does nothing. Though it's still strange that the box instruction has even been created (maybe lazyiness/easier design at code generation?).

这篇关于为什么带有T:类约束的通用方法会导致装箱?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆