Alguien alguna idea de por qué un método genérico que restringe T a clase tendría instrucciones de boxeo en el código MSIL generado?¿Por qué el método genérico con constancia de T: clase resulta en el boxeo?
Estaba bastante sorprendido por esto ya que seguramente debido a que T se está restringiendo a un tipo de referencia, el código generado no debería necesitar realizar ningún boxeo.
Aquí es el código 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;
}
}
Aquí está la IL generada:
.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
}
Aviso la caja !! T instrucciones.
¿Alguien alguna idea de por qué esto se está generando?
¿Alguien alguna idea de cómo evitar esto?
Gracias, Phil
Jon está fuera supongo que :-) – Peter
¡He encontrado tu respuesta y era un duplicado! Gran pregunta, por cierto :) Por favor, consulte http://stackoverflow.com/questions/646517/boxing-when-using-generics-in-c –
La esencia de la respuesta que he vinculado es que una instrucción de boxeo en una referencia tipo es efectivamente un nop. Esto permite al compilador emitir libremente instrucciones de boxeo que el JIT puede eliminar para los tipos construidos cerrados que se crearon con un tipo de referencia como argumento de tipo genérico. En su caso (ya que 'T' está restringido como un tipo de referencia) ninguna de las dos instrucciones de boxeo que se emitieron se ejecutará alguna vez. –