Quelqu'un peut-il savoir pourquoi une méthode générique qui contraint T à classer aurait des instructions de boxing dans le code MSIL? J'ai été assez surpris par cela puisque sûrement T étant contraint à un type de référence, le code généré ne devrait pas avoir besoin d'effectuer de boxe.Pourquoi la méthode générique avec la contrainte de T: class aboutit à la boxe?
Voici le code 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;
}
}
Voici l'IL généré:
.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
}
Notez la boîte !! T instructions.
Quelqu'un a-t-il une idée de la raison pour laquelle cela est généré?
Quelqu'un a des idées pour éviter cela?
Merci, Phil
Jon est sorti je suppose :-) – Peter
J'ai trouvé ta réponse et c'était une copie! Grande question, au fait :) S'il vous plaît voir http://stackoverflow.com/questions/646517/boxing-when-using-generics-in-c –
L'essentiel de la réponse que j'ai liée est qu'une instruction de boxe sur une référence le type est effectivement un nop. Cela permet au compilateur d'émettre librement des instructions de boxe qui peuvent être supprimées par le JIT pour les types construits fermés qui ont été créés avec un type de référence en tant qu'argument de type générique. Dans votre cas (puisque 'T' est contraint comme type de référence), aucune des deux instructions de boxe qui ont été émises ne sera exécutée. –