Ktoś ma pojęcia, dlaczego ogólny sposób, który ogranicza T do klasy miałby instrukcje bokserskie w generuje kod MSIL?Dlaczego metoda generyczna ze zmienną T: class powoduje boksowanie?
Byłem bardzo zaskoczony tym, ponieważ na pewno, ponieważ T jest ograniczony do typu referencyjnego wygenerowany kod nie musi wykonywać żadnego boksu.
Oto kod 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;
}
}
Oto generowane 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
}
Wskazówka pole !! T instrukcje.
Ktoś ma pojęcie, dlaczego jest generowany?
Ktoś ma pomysły, jak tego uniknąć?
Dzięki Phil
Jon jest obecnie zgaduję :-) – Peter
Znalazłem twoją odpowiedź i był to duplikat! Świetne pytanie, nawiasem mówiąc :) Proszę zobacz http://stackoverflow.com/questions/646517/boxing-when-using-generics-in-c- –
Istotą odpowiedzi, którą podjąłem jest to, że instrukcja boksu na odniesienie typ jest efektywnie nop. Dzięki temu kompilator może swobodnie emitować instrukcje boksu, które mogą być usuwane przez JIT dla zamkniętych typów konstrukcyjnych, które zostały utworzone z typem odniesienia jako typowy argument typu. W twoim przypadku (ponieważ 'T' jest ograniczony jako typ odniesienia) żadna z dwóch wysłanych instrukcji boksu nie zostanie uruchomiona. –