C#의 박싱 및 언박싱에 대한 자세한 설명

高洛峰
풀어 주다: 2017-01-24 14:20:16
원래의
1163명이 탐색했습니다.

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
로그인 후 복사
unboxing 작업의 실행 프로세스는 boxing 작업 프로세스와 정확히 반대입니다. 힙에 저장된 참조 유형 값을 값 유형으로 변환하여 제공합니다. 값 유형 변수에.

박싱 작업과 언박싱 작업은 CPU와 메모리 리소스를 추가로 소비하므로 박싱 작업과 언박싱 작업의 소비를 줄이기 위해 C# 2.0 이후에 제네릭이 도입되었습니다.

C#의 boxing과 unboxing에 대한 더 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!