J'essaie de rassembler toutes les situations dans lesquelles la boxe se produit en C #:
Conversion du type de valeur en
System.Object
type:struct S { } object box = new S();
Conversion du type de valeur en
System.ValueType
type:struct S { } System.ValueType box = new S();
Conversion de la valeur du type d'énumération en
System.Enum
type:enum E { A } System.Enum box = E.A;
Conversion du type de valeur en référence d'interface:
interface I { } struct S : I { } I box = new S();
Utilisation de types valeur dans la concaténation de chaînes C #:
char c = F(); string s1 = "char value will box" + c;
note: les constantes de
char
type sont concaténées au moment de la compilationRemarque: le compilateur depuis la version 6.0 C # Optimise concaténation impliquant
bool
,char
,IntPtr
,UIntPtr
typesCréation d'un délégué à partir d'une méthode d'instance de type valeur:
struct S { public void M() {} } Action box = new S().M;
Appel de méthodes virtuelles non remplacées sur des types de valeur:
enum E { A } E.A.GetHashCode();
Utilisation de modèles constants C # 7.0 sous
is
expression:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
Boxing dans les conversions de types de tuple C #:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
Paramètres facultatifs de
object
type avec des valeurs par défaut de type valeur:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Vérification de la valeur du type générique sans contrainte pour
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
note: cela peut être optimisé par JIT dans certains runtimes .NET
Valeur de test de
struct
type de type non contraint ou générique avec les opérateursis
/as
: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);
note: cela peut être optimisé par JIT dans certains runtimes .NET
Y a-t-il d'autres situations de boxe, peut-être cachées, que vous connaissez?