2014-12-22 10 views
-2

C# Int에서 유형은 ValueType에서 파생됩니다. ValueTypeObject 유형에서 파생됩니다. 따라서 IntObject입니다.권투와 언 박싱은 신화인가?

모든 값 유형 변수가 이미 Object이면 복싱/언 박싱 중에 실제로 어떻게됩니까?

+0

'Int'유형이 없습니다. 아마도'System.Int32'를 의미할까요? –

+2

귀하의 질문은 매우 빠르게 무한대로 downvoted 될 것이라고 가정합니다. – dymanoid

+0

먼저 읽습니다. 예를 들면 다음과 같습니다. http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx –

답변

9

Object 인스턴스에 대한 특정 메모리 레이아웃이 있습니다. 공간을 절약하고 원시 코드 (COM, p/invoke 등)와의 호환성을 위해 값 유형의 인스턴스가 해당 레이아웃을 준수하지 않습니다.

"boxing"은 실제 "개체"인스턴스의 값을 예상 레이아웃과 함께 포함합니다. 이것은 object 인스턴스에서 작동하는 모든 다양한 함수에 의한 다형성 사용을 가능하게하고 해당 인터페이스를 기대합니다.

Int32Object의 하위 클래스라고 말하는 것이 정확하지 않습니다. "boxed Int32"이지만 "unboxed Int32"인스턴스에는 하위 클래스 하위 개체가 전혀 없습니다. (특히 object 레이아웃에는 실제로 파생 된 유형의 인스턴스에 대한 포인터가 포함되어 있습니다. 값 유형 객체의 유형은 기타 관계로 결정됩니다., 형식 메타 데이터가 포함되어 있지 않습니다. 또는 모니터 . 또는 object의 다른 모든 케이크. 박스형 버전 않습니다.) Object

+0

그러나 Int32는 Object의 하위 클래스입니다. Animation에서 Cat을 파생시키고 Move 메서드를 재정의하면 일부 메서드가 오버로드 되었기 때문에 Cat이 Animal의 인스턴스가 아니라고 말할 수 없습니다. –

+0

왜 값 유형의 인스턴스가 메모리 레이아웃을 따르지 않는지? 그 차이점은 무엇입니까? –

+0

@Ask : 나는 단순히 동일하지는 않지만 행동은 존재하지 않는다고 말하는 것이 아닙니다. 값 유형에는 vtable이 없어 가상 메소드를 가질 수 없습니다. 모니터가 없으므로 lock 문과 함께 사용할 수 없습니다. –

2

생각해을 단순히 치형이 상속되는 기본 클래스 값이 아닌 유형의 행동를 나타내는 유형으로. Boxing은 값 형식을 참조 형식 래퍼에 넣은 다음 값 형식을 으로 변경하고과 같은 개체를 만듭니다.

MSDN에서

:

참조 및 값이 두 종류의 궁극적 인 기본 Object 클래스에서 파생됩니다. 에 대한 값 유형이 오브젝트처럼 작동해야하는 경우 값 유형을 참조 오브젝트처럼 보이게하는 랩퍼가 힙에 할당되고 값 유형의 값 이 복사됩니다.