2009-08-31 2 views
5

.NET 구조체와 같은 int 및 value 유형과 같은 기본 데이터 유형이 있습니다..NET에서 참조와 기본 유형 및 값 유형을 구분하는 방법

또한 참조 유형이 있습니다. 그들 모두는 객체 클래스에서 파생 된 것 같습니다.

.NET에서 참조 유형에 대해 기본 값 유형을 결정하는 방법은 무엇입니까?

어디에서 끝났습니까? 컴파일러 또는 JIT에서?

이것은 컴파일러의 기능에 속합니까?

+0

죄송합니다. 귀하의 질문에 대해 이해할 수 없습니다. –

답변

11

내장 된 공통 유형 시스템 (CTS) 프리미티브를 비롯한 모든 값 유형은 CTS 유형 "System.ValueType"(직접 열거 형 제외)에서 직접 파생됩니다.

그래서 컴파일러는 모든 유형의 기본 유형을 검사하여 알 수 있습니다. "System.ValueType"이면 값 유형이고, 그렇지 않으면 참조 유형입니다.

편집 :

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

이 ... System.ValueType에서 직접 파생되지 않습니다뿐만 열거 형은, 그들은 ... System.ValueType에서 파생 System.Enum에서

+0

'System.ValueType'에서 파생되지만 값 유형 자체가 아닌'System.Enum'을 제외합니다. 하지만 모든 enum 형은 * System.Enum에서 파생 된 값 유형으로 System.ValueType이 아닌 기본 유형을 만듭니다. 따라서 값 유형은 System.Enum을 제외하고 System.ValueType에서 파생 된 유형이지만이 테스트의 내부 구현은 이보다 효율적으로 수행 될 수 있습니다. –

+0

Charles에게 감사드립니다. java는 비슷한 방식으로 작동합니까? –

+0

@ 280Z28 : System.Enum은 직접 사용할 수있는 유형이 아니므로 그 의미가 확실하지 않습니다. 실제로 제네릭 형식에 대한 제약 조건으로 사용하기에 충분하지 않습니다 (http://msdn.microsoft.com/en-us/library/d5x73970.aspx 아래 참조). –

2

값 유형은 실제로 자체가 System.Object에서 파생 된 System.ValueType에서 파생됩니다.

2

값을 도출 유형은 System.ValueType에서 파생되며 다른 것들 중에서는 GetHashCodeEquals의 기본 (그러나 느린) 구현을 제공합니다. (반사를 사용하기 때문에 속도가 느립니다.)

과 같은 기본 유형은 box 명령어를 사용하여 IL에서 값 유형으로 박스 처리 될 수 있습니다. 그들은 그들과 협력 할 특별한 일리노이 명령을 가지고 있습니다.

참조 유형은 다른 모든 클래스입니다.

unsafe 코드에 사용할 수있는 포인터가 있으며 object에서 전혀 파생되지 않습니다. EDIT - proof.

+0

포인터 유형이 IntPtr에서 파생되지 않았습니까? –

+0

예, 완전히 관련이 없습니다. 한가지,'IntPtr'는 구조체이고 구조체로부터 파생 될 수 없습니다. – SLaks

관련 문제