Boxing 및 Unboxing은 값 유형과 참조 유형 간의 변환을 위해 수행되는 작업입니다.
1. 값 유형이 참조 유형으로 변환될 때 Boxing이 발생합니다
2. 참조 유형이 값 유형으로 변환될 때 Unboxing이 발생합니다
위 두 문장은 이해하기 어렵지 않지만, 더 깊이 들어가 설명하려면 약간의 공간이 필요합니다.
먼저 복싱 중에 무슨 일이 일어나는지 살펴보겠습니다. 다음은 복싱 코드의 가장 간단한 줄입니다.
object obj = 1;
이 명령문 줄은 우리 모두 알고 있듯이 정수 상수 1을 객체 유형 변수 obj에 할당합니다. 상수 1은 값 유형이고 값 유형은 스택에 배치되어야 하며 객체는 값 유형을 힙에 배치해야 하는 참조 유형이므로 박싱 작업을 수행해야 합니다.
이 문장의 IL 코드는 다음과 같습니다. 주석 부분에 주의하십시오.
.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的局部变量中
위는 복싱 작업을 수행할 때 수행해야 하는 작업입니다. 힙에 메모리 공간을 적용하고 스택의 값 유형 데이터를 적용된 힙 메모리 공간에 복사하면 메모리와 CPU 리소스가 확실히 소모됩니다. 언박싱 작업이 어떻게 작동하는지 살펴보겠습니다.
다음 C# 코드를 살펴보세요.
object objValue = 4; int value = (int)objValue;
위의 두 줄의 코드는 정수 상수 4를 참조 유형으로 박싱하는 작업을 수행합니다. 객체 변수 objValue; 그런 다음 언박싱 작업을 수행하여 힙에 저장된 참조 변수 objValue를 로컬 정수 값 유형 변수 값에 저장합니다.
IL 코드도 살펴봐야 합니다.
.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
박싱 작업과 언박싱 작업은 CPU와 메모리 리소스를 추가로 소비하므로 박싱 작업과 언박싱 작업의 소비를 줄이기 위해 C# 2.0 이후에 제네릭이 도입되었습니다.
C#의 boxing과 unboxing에 대한 더 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!