È possibile evitare la boxe se si modifica la definizione di Method
a:
void Method<T>(T i) where T : I
{
}
Questo evita la boxe, perché in fase di esecuzione il CLR è specializzata metodi generici in base al tipo di argomento generico (s). I tipi di riferimento possono tutti condividere la stessa implementazione, mentre i tipi di struct hanno ciascuno la propria versione. Ciò significa che tutte le operazioni in Method
che dipendono da T
terranno conto della dimensione del tipo di struttura in calcestruzzo.
È necessario fare attenzione però, perché richiamare metodi virtuali definiti su System.Object
come Equals
o GetHashCode
causerà i
essere inscatolato dal metodo di spedizione virtuale richiede un puntatore tavolo metodo (anche se la squadra può essere in grado di fare l'invio staticamente in qualche casi). Tuttavia, se il tipo di struct sovrascrive il metodo (i) virtuale in questione, non sarà necessario eseguire la boxe, poiché il metodo da chiamare è nuovamente noto staticamente poiché le strutture (e quindi i loro membri) sono sigillate.
Di solito è possibile evitare di chiamare Equals
o GetHashCode
direttamente vincolando T
ulteriormente implementare IEquatable<T>
e utilizzando un IEqualityComparer<T>
per i confronti per esempio
void Method<T>(T i) where T : I, IEquatable<T>
{
T other = ...
if(i.Equals(other)) //avoids boxing
{
}
}
suona come una potenziale domanda intervista a ... cercherò di ricordare che uno –