Estoy tratando de recopilar todas las situaciones en las que ocurre el boxeo en C #:
Conversión de tipo de valor en
System.Object
tipo:struct S { } object box = new S();
Conversión de tipo de valor en
System.ValueType
tipo:struct S { } System.ValueType box = new S();
Conversión del valor del tipo de enumeración en
System.Enum
tipo:enum E { A } System.Enum box = E.A;
Conversión del tipo de valor en referencia de interfaz:
interface I { } struct S : I { } I box = new S();
Usando tipos de valor en la concatenación de cadenas de C #:
char c = F(); string s1 = "char value will box" + c;
nota: las constantes de
char
tipo se concatenan en tiempo de compilaciónNOTA: desde la versión 6.0 de C # compilador optimiza la concatenación que implica
bool
,char
,IntPtr
,UIntPtr
tiposCrear delegado a partir del método de instancia de tipo de valor:
struct S { public void M() {} } Action box = new S().M;
Llamar a métodos virtuales no anulados en tipos de valor:
enum E { A } E.A.GetHashCode();
Usando patrones constantes de C # 7.0 bajo
is
expresión:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
Boxing en conversiones de tipos de tuplas de C #:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
Parámetros opcionales de
object
tipo con valores predeterminados de tipo de valor:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Comprobando el valor del tipo genérico sin restricciones para
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
nota: esto puede ser optimizado por JIT en algunos tiempos de ejecución .NET
Escriba el valor de prueba de
struct
tipo genérico o no restringido con operadoresis
/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);
nota: esto puede ser optimizado por JIT en algunos tiempos de ejecución .NET
¿Hay más situaciones de boxeo, quizás ocultas, que conozcas?