Sto cercando di raccogliere tutte le situazioni in cui si verifica la boxe in C #:
Conversione del tipo di valore in
System.Object
tipo:struct S { } object box = new S();
Conversione del tipo di valore in
System.ValueType
tipo:struct S { } System.ValueType box = new S();
Conversione del valore del tipo di enumerazione in
System.Enum
tipo:enum E { A } System.Enum box = E.A;
Conversione del tipo di valore in riferimento all'interfaccia:
interface I { } struct S : I { } I box = new S();
Utilizzo dei tipi di valore nella concatenazione di stringhe C #:
char c = F(); string s1 = "char value will box" + c;
nota: le costanti di
char
tipo vengono concatenate in fase di compilazioneNota: a partire dalla versione 6.0 del compilatore C # Ottimizza concatenazione che coinvolge
bool
,char
,IntPtr
,UIntPtr
tipiCreazione di delegato dal metodo di istanza del tipo di valore:
struct S { public void M() {} } Action box = new S().M;
Chiamata di metodi virtuali non sostituiti sui tipi di valore:
enum E { A } E.A.GetHashCode();
Uso di modelli di costanti C # 7.0 sotto
is
espressione:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
Boxing nelle conversioni di tipi di tupla C #:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
Parametri opzionali di
object
tipo con valori predefiniti del tipo di valore:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Verifica del valore del tipo generico non vincolato per
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
nota: questo può essere ottimizzato da JIT in alcuni runtime .NET
Valore del test di
struct
tipo di tipo non vincolato o generico conis
/as
operatori:bool M<T>(T t) => t is int; int? M<T>(T t) => t as int?; IEquatable<T> M<T>(T t) => t as IEquatable<T>; M(42);
nota: questo può essere ottimizzato da JIT in alcuni runtime .NET
Ci sono altre situazioni di boxe, magari nascoste, che conosci?