Heim >Backend-Entwicklung >C#.Net-Tutorial >Ausführliche Erklärung des Boxens und Unboxings in C#

Ausführliche Erklärung des Boxens und Unboxings in C#

高洛峰
高洛峰Original
2017-01-24 14:20:161214Durchsuche

Boxing und Unboxing sind Vorgänge, die zum Konvertieren zwischen Werttypen und Referenztypen ausgeführt werden müssen.
1. Boxing tritt auf, wenn ein Werttyp in einen Referenztyp konvertiert wird
2. Unboxing tritt auf, wenn ein Referenztyp in einen Werttyp konvertiert wird
Die beiden obigen Sätze sind nicht schwer zu verstehen, aber wenn Sie Gehen Sie tiefer. Es braucht etwas Platz, um es zu erklären.
Sehen wir uns zunächst an, was beim Boxen passiert.

object obj = 1;

Diese Anweisungszeile weist der Variablen obj des Objekttyps die Ganzzahlkonstante 1 zu Konstante 1 ist ein Werttyp, der auf dem Stapel platziert werden muss, während Objekt ein Referenztyp ist, der auf dem Heap platziert werden muss. Um den Werttyp auf den Heap zu legen, ist eine Boxing-Operation erforderlich.
Der IL-Code dieser Anweisungszeile lautet wie folgt:

.locals init (
  [0] object objValue
)  //以上三行IL表示声明object类型的名称为objValue的局部变量
IL_0000: nop
IL_0001: ldc.i4.s 9 //表示将整型数9放到栈顶
IL_0003: box [mscorlib]System.Int32 //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
IL_0008: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中

Das Obige ist die Operation, die beim Boxen ausgeführt werden muss Es ist unvermeidlich, Speicher auf dem Heap-Speicherplatz zu beantragen und die Werttypdaten auf dem Stapel in den zugewiesenen Heap-Speicherplatz zu kopieren, was definitiv Speicher- und CPU-Ressourcen verbraucht. Werfen wir einen Blick darauf, wie der Unboxing-Vorgang funktioniert:
Bitte schauen Sie sich den folgenden C#-Code an:

object objValue = 4;
int value = (int)objValue;

Die beiden obigen Codezeilen führen einen Boxing-Vorgang aus, um die Ganzzahlkonstante 4 in die Referenz einzupacken Geben Sie die Objektvariable objValue ein und führen Sie dann einen Unboxing-Vorgang durch, um die auf dem Heap gespeicherte Referenzvariable objValue im lokalen Ganzzahlwert-Variablenwert zu speichern.
Wir müssen uns auch den IL-Code ansehen:

.locals init (
  [0] object objValue,
  [1] int32 'value'
) //上面IL声明两个局部变量object类型的objValue和int32类型的value变量
IL_0000: nop
IL_0001: ldc.i4.4 //将整型数字4压入栈
IL_0002: box [mscorlib]System.Int32  //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
IL_0007: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中
IL_0008: ldloc.0//将索引为0的局部变量(即objValue变量)压入栈
IL_0009: unbox.any [mscorlib]System.Int32 //执行IL 拆箱指令unbox.any 将引用类型object转换成System.Int32类型
IL_000e: stloc.1 //将栈上的数据存储到索引为1的局部变量即value
Der Ausführungsprozess des Unboxing-Vorgangs ist genau das Gegenteil des Boxing-Vorgangs. Er konvertiert den auf dem Heap gespeicherten Referenztypwert in einen Werttyp und weist es dem Werttyp variable zu.

Boxing-Vorgänge und Unboxing-Vorgänge verbrauchen zusätzliche CPU- und Speicherressourcen. Daher wurden nach c# 2.0 Generika eingeführt, um den Verbrauch von Boxing- und Unboxing-Vorgängen zu reduzieren.

Ausführlichere Erklärungen zum Boxen und Unboxen in C# finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn