Estou tentando coletar todas as situações em que o boxe ocorre em C #:
Convertendo tipo de valor em
System.Object
tipo:struct S { } object box = new S();
Convertendo tipo de valor em
System.ValueType
tipo:struct S { } System.ValueType box = new S();
Convertendo o valor do tipo de enumeração em
System.Enum
tipo:enum E { A } System.Enum box = E.A;
Convertendo o tipo de valor em referência de interface:
interface I { } struct S : I { } I box = new S();
Usando tipos de valor na concatenação de string C #:
char c = F(); string s1 = "char value will box" + c;
nota: constantes de
char
tipo são concatenadas em tempo de compilaçãonota: desde a versão 6.0 C # compilador otimiza concatenação envolvendo
bool
,char
,IntPtr
,UIntPtr
tiposCriando delegado a partir do método de instância do tipo de valor:
struct S { public void M() {} } Action box = new S().M;
Chamando métodos virtuais não substituídos em tipos de valor:
enum E { A } E.A.GetHashCode();
Usando padrões de constantes C # 7.0 sob
is
expressão:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
Encaixe em conversões de tipos de tupla C #:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
Parâmetros opcionais de
object
tipo com valores padrão de tipo de valor:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Verificando o valor do tipo genérico irrestrito para
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
observação: isso pode ser otimizado por JIT em alguns tempos de execução .NET
Valor de teste de
struct
tipo de tipo irrestrito ou genérico comis
/as
operadores: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);
observação: isso pode ser otimizado por JIT em alguns tempos de execução .NET
Existem mais situações de boxe, talvez escondidas, que você conheça?