Próbuję zebrać wszystkie sytuacje, w których boks występuje w C #:
Konwersja typu wartości na
System.Objecttyp:struct S { } object box = new S();Konwersja typu wartości na
System.ValueTypetyp:struct S { } System.ValueType box = new S();Konwersja wartości typu wyliczenia na
System.Enumtyp: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
chartypu są łączone w czasie kompilacjiUwaga: od wersji 6.0 C # kompilator optymalizuje konkatenacji udziałem
bool,char,IntPtr,UIntPtrrodzajeTworzenie 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
iswyraż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
objecttypu z wartościami domyślnymi typu wartości:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-siteSprawdzanie 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
structogó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?