Próbuję zebrać wszystkie sytuacje, w których boks występuje w C #:
Konwersja typu wartości na
System.Object
typ:struct S { } object box = new S();
Konwersja typu wartości na
System.ValueType
typ:struct S { } System.ValueType box = new S();
Konwersja wartości typu wyliczenia na
System.Enum
typ:enum E { A } System.Enum box = E.A;
Konwersja typu wartości na odniesienie do interfejsu:
interface I { } struct S : I { } I box = new S();
Używanie typów wartości w konkatenacji ciągów C #: Using value types in C # string concatenation:
char c = F(); string s1 = "char value will box" + c;
uwaga: stałe
char
typu są łączone w czasie kompilacjiUwaga: od wersji 6.0 C # kompilator optymalizuje konkatenacji udziałem
bool
,char
,IntPtr
,UIntPtr
rodzajeTworzenie delegata z metody wystąpienia typu wartości:
struct S { public void M() {} } Action box = new S().M;
Wywołanie niezastępowanych metod wirtualnych na typach wartości:
enum E { A } E.A.GetHashCode();
Korzystanie ze stałych wzorców języka C # 7.0 w
is
wyrażeniem:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
Boks w C # konwersjach typów krotek:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
Opcjonalne parametry
object
typu z wartościami domyślnymi typu wartości:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Sprawdzanie wartości nieograniczonego typu ogólnego dla
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
Uwaga: może to zostać zoptymalizowane przez JIT w niektórych środowiskach .NET
Wartość testowania typu typu nieograniczonego lub
struct
ogólnego z operatoramiis
/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);
uwaga: może to zostać zoptymalizowane przez JIT w niektórych środowiskach .NET
Czy są jakieś sytuacje bokserskie, może ukryte, o których wiesz?