IT TIP

boxing / unboxing과 type casting의 차이점은 무엇입니까?

itqueen 2020. 11. 24. 20:44
반응형

boxing / unboxing과 type casting의 차이점은 무엇입니까?


boxing / unboxing과 type casting의 차이점은 무엇입니까?

종종 용어는 같은 의미로 사용되는 것 같습니다.


Boxing은 nullable이 아닌 값 형식을 참조 형식으로 변환하거나 값 형식을 구현하는 일부 인터페이스 (예 :) int변환하는 것을 말합니다 IComparable<int>. 또한 기본 값 형식을 nullable 형식으로 변환하는 것도 boxing 변환입니다. (주의 :이 주제에 대한 대부분의 논의는 후자의 두 가지 유형의 변환을 무시합니다.)

예를 들면

int i = 5;
object o = i;

i유형의 인스턴스 로 변환 합니다 object.

Unboxing은 object또는 의 인스턴스에서 ValueTypenullable이 아닌 값 형식 으로의 명시 적 변환 , 즉 인터페이스 형식을 nullable이 아닌 값 형식 (예 : IComparable<int>to int) 으로 변환하는 것을 말합니다 . 또한 nullable 형식을 기본 형식으로 변환하는 것도 unboxing 변환입니다. (주의 :이 주제에 대한 대부분의 논의는 후자의 두 가지 유형의 변환을 무시합니다.)

예를 들면

object o = (int)5;
int i = (int)o;

boxed in 정수 o를 유형의 인스턴스 로 변환합니다 int.

유형 캐스트는 표현식을 주어진 유형으로 명시 적으로 변환하는 것입니다. 그러므로

(type) expression

명시 적으로 expression유형의 객체 로 변환 합니다 type.


Boxing 및 Unboxing은 유형 캐스트의 하위 집합입니다. Boxing은 값 유형을 참조 유형으로 처리하는 행위입니다 (실제로는 스택에서 해당 값 유형의 내용을 힙으로 복사하고 해당 객체에 대한 참조를 반환하는 작업이 포함됨). 이를 통해 호환 가능한 참조 유형이 예상되는 모든 곳에서 값 유형을 전달할 수 있습니다. 또한 가상 메서드 호출 및 참조 유형의 기타 기능을 값 유형에서 수행 할 수 있습니다. Unboxing은이 작업의 반대입니다 (박스형 개체에서 값 유형을 가져옴).

유형 캐스트는 특정 유형의 변수에서 다른 유형으로의 모든 유형의 변환에 사용되는 용어 입니다. 더 넓은 개념입니다.

몇 분 전에 나는이 차이를 다루는 관련 질문에 답했다 . 요약하면 C # 캐스트 연산자에서 생성 된 다양한 유형의 IL 명령어를 분류했습니다.

  1. Boxing ( boxIL 명령) 및 unboxing ( unboxIL 명령)
  2. 상속 계층 구조를 통한 캐스팅 ( dynamic_cast<Type>C ++에서 와 같이 castclassIL 명령어를 사용하여 확인)
  3. 기본 유형 간 캐스트 ( static_cast<Type>C ++에서 와 같이 기본 유형간에 다양한 유형의 캐스트에 대한 많은 IL 명령어가 있음)
  4. 사용자 정의 변환 연산자 호출 (IL 수준에서는 적절한 op_XXX메서드 에 대한 메서드 호출 일뿐입니다 ).

Boxing은 값 유형 (int, double, float, Guid 등)을 참조 유형 (System.Object, System.String 등)으로 바꾸는 용어입니다. 이 boxing 작업을 수행하면 힙에 메모리가 할당됩니다 (가비지 수집기가 결국 회수해야 함). Unboxing은이 프로세스의 역으로 ​​참조 유형을 가져와 값 유형으로 변환합니다.

캐스팅은 형식 (예 : System.Object)을 가져 와서 다른 형식 (예 : System.String)으로 처리합니다.

C #으로 상자를 만들면 다른 유형으로 캐스팅하는 것입니다. 차이점은 새로운 참조 유형이 생성 될 때 추가 메모리를 할당한다는 것입니다 .

결론 : boxing은 값 유형을 참조 유형으로 변환하는 특수한 유형의 캐스트이며 새 참조 유형을 할당해야합니다.


boxing / unboxing 및 형식 캐스팅은 두 가지 다른 작업이지만 동일한 구문을 사용합니다.

그들은 그것에 대해 이야기하는 사람이 실제로 무슨 일이 일어나고 있는지 모를 때만 같은 의미로 사용됩니다.

Boxing은 값 유형을 힙에 객체로 저장하고 unboxing은 객체에서 값을 읽습니다. 정확한 유형이므로 값의 상자를 풀 수 있습니다.

주조는 (AN에서 같은 다른 기본 타입으로 기본 형식을 변환 할 때입니다 intA를 long), 또는 (에서 같은 참조의 유형을 변경하는 경우 List<int>IEnumerable<int>).


Boxing은 값 유형 변수 (즉, 정수)를 참조 유형으로 변환하는 것을 의미합니다. Unboxing은 유형 캐스팅을 사용하는 그 반대입니다. .NET 세계에서 모든 것은 간단히 말해서 "개체"유형에서 파생됩니다.

예 (C # 예) :

int myInt = 0;                 // original variable (unboxed to begin with)
object boxed = myInt;          // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting

여기서 빼놓을 수없는 것은 유형 시스템의 통합으로 값 유형을 참조 유형으로 처리 할 수 ​​있다는 것입니다. 이 기사 는 boxing / unboxing에 대해 더 심도있게 살펴 봅니다.

참고 URL : https://stackoverflow.com/questions/1085144/what-is-the-difference-between-boxing-unboxing-and-type-casting

반응형