Można uniknąć boks po zmianie definicji Method
do:
void Method<T>(T i) where T : I
{
}
ten sposób unika się boks, ponieważ w czasie wykonywania CLR specjalizuje metody rodzajowe w zależności od typu rodzajowego argumentu (ów). Typy referencyjne mogą mieć tę samą implementację, podczas gdy typy struktur mają własną wersję. Oznacza to, że wszystkie operacje w Method
, które zależą od T
, będą uwzględniać rozmiar konkretnego typu struktury.
Musisz uważać jednak, ponieważ wywoływanie metod wirtualnych zdefiniowane na System.Object
jak Equals
lub GetHashCode
spowoduje i
być zapakowane ponieważ metoda wirtualnego wysłania wymaga wskaźnik metoda tabeli (choć JIT może być w stanie zrobić wysyłkę statycznie w niektórych sprawy). Jeśli jednak twój typ struktury zastępuje metodę (metody) wirtualne, wówczas nie będzie trzeba wykonywać boksowania, ponieważ metoda wywoływania jest ponownie znana statycznie, ponieważ konstrukcje (a tym samym ich członkowie) są zapieczętowane.
Zazwyczaj można uniknąć wywoływania Equals
lub GetHashCode
bezpośrednio poprzez ograniczenie T
dalsze wdrożenie IEquatable<T>
i używając porównań np IEqualityComparer<T>
void Method<T>(T i) where T : I, IEquatable<T>
{
T other = ...
if(i.Equals(other)) //avoids boxing
{
}
}
brzmi jak potencjalnego pytanie wywiad do ... Postaram się pamiętać, że jedna –