Ich versuche, alle Situationen zu erfassen, in denen Boxen in C # auftritt:
Werttyp in Typ
System.Object
konvertieren:struct S { } object box = new S();
Werttyp in Typ
System.ValueType
konvertieren:struct S { } System.ValueType box = new S();
Konvertieren des Werts des Aufzählungstyps in einen
System.Enum
Typ:enum E { A } System.Enum box = E.A;
Werttyp in Schnittstellenreferenz konvertieren:
interface I { } struct S : I { } I box = new S();
Verwenden von Werttypen bei der Verkettung von C # -Strings:
char c = F(); string s1 = "char value will box" + c;
Hinweis: Konstanten vom
char
Typ werden beim Kompilieren verkettetAnmerkung: seit Version 6.0 C # Compiler optimiert Verkettung beteiligt
bool
,char
,IntPtr
,UIntPtr
ArtenErstellen eines Delegaten aus einer Instanzmethode mit Werttyp:
struct S { public void M() {} } Action box = new S().M;
Aufrufen nicht überschriebener virtueller Methoden für Werttypen:
enum E { A } E.A.GetHashCode();
Verwenden von C # 7.0-Konstantenmustern unter
is
Ausdruck:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
Boxen in C # -Tupeltypen Konvertierungen:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
Optionale Parameter vom
object
Typ mit Standardwerten für den Werttyp:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Überprüfen des Werts des nicht eingeschränkten generischen Typs auf
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
Hinweis: Dies kann in einigen .NET-Laufzeiten durch JIT optimiert werden
Typprüfwert vom uneingeschränkten oder
struct
generischen Typ mitis
/as
Operatoren: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);
Hinweis: Dies kann in einigen .NET-Laufzeiten durch JIT optimiert werden
Gibt es weitere Situationen des Boxens, vielleicht versteckt, von denen Sie wissen?