2012-11-26 2 views
1

.NET에서 모든 값 형식은 System.ValueType이라는 클래스에서 상속됩니다. System.ValueType은 클래스이므로 reference type입니다.값 유형이 참조 유형에서 파생되는 방법/이유는 무엇입니까?

제 질문은 어떻게 가능하고 왜 value typereference type에서 파생됩니까? 치 형은 값 형식에 대한 암시 적 기본 클래스이지만

+2

유형 시스템에는 사용자가 직접 작성할 수있는 몇 가지 특수 유형이 있습니다. 그들은 반드시 당신이해야하는 것과 같은 규칙을 따르지 않습니다. –

+1

크게, 그것은 ** system.ValueType'에서 상속받은 ** 정의 **가 ** struct **가되도록 ** 정의되었으므로 다른 대우를받습니다. 이유에 대해서는 :'object' /'ValueType'으로 형변환 할 수 있습니다 (그러나 이것은 권투 변환입니다). –

+1

@MarcGravell'System.Enum'은 구조체가 아닌 참조 형이지만 클래스이며, ValueType으로부터 상속받습니다. – hvd

답변

6

다음은 직접 ValueType에서 상속하는 클래스를 만들 수 없습니다, 문서

의 핵심 단락입니다. 대신 개별 컴파일러는 값 유형 만들기를 지원하기 위해 언어 키워드 또는 구문 (예 : 구조체를 C# 및 구조체 ... End Structure in Visual Basic)을 제공합니다.

컴파일러가 System.Object의 재정의 가상 메서드를 컴파일 할 때 상속이 발생합니다. System.ValueType 클래스는 ToString(), GetHashCode() 등의보다 적절한 오버로드를 제공하기 만합니다. struct 키워드 (C#의 경우)가 사용 된 경우 컴파일러에서 이러한 오버로드를 사용한다고 문서에 명시되어 있습니다. 컴파일러는 System.Object 메서드 대신 System.ValueType 메서드를 사용합니다.

+2

엄밀히 말하면, 여전히 System.Object 메소드를 사용합니다. 그러나 그것은 :'callvirt'가 아닌'constrained' +'callvirt' 호출입니다. –

+0

@MarcGravell - 저는 당신을 의심하지 않지만 문서가'ValueType이 Object로부터 가상 메소드를 오버라이드하는 이유는 무엇입니까? 값 유형에 대한 더 적절한 구현 '? 당신이 말하는 것을 설명 해주는 링크를 제공 할 수 있습니까? – Tobsey

+0

@Tobsey :'Equals'와'HashCode'의 기본 구현은'X.Equals (Y)'는'X'와'Y'가 같은 힙 객체 인스턴스를 참조 할 때만 참을 리턴한다고 가정합니다. '5.Equals (5) '는 값 5를 갖는 두 개의 별개의 객체 인스턴스가 서로 비교되도록하기 때문에 값 유형에서는 의미가 없습니다. 그러므로,'ValueType'은'Equals'를 오버라이드하므로 기본적으로 해당 필드가 일치하면 사물을 동등한 것으로 간주합니다. – supercat

2

값 유형 또는 참조 유형이 상속되지 않기 때문에 가능합니다. Enum에도 동일하게 적용됩니다. 클래스 자체는 참조 유형이지만 열거 형은 값 유형입니다.

1

모든 값 유형이 참조 유형 인 System.Object에서 파생 될 수 있습니다. 이때

int i = 3; 
int j = 3; 
object io = i; 
object jo = j; 

, iojoij 값의 복사본을 참조 참조한다.

int i2 = (int)io; 
int j2 = (int)jo; 

기능적으로,이 object로의 전환이 장면 뒤에 class ValueWrapper<T> { public T value; } 객체를 생성 것처럼 거의 작동하고, ionew ValueWrapper<int> { value = i }로 설정 : 값은 다시 캐스트를 사용하여 추출 할 수 있습니다. io에서 int까지의 캐스트는 ((ValueWrapper<int>)io).value입니다.

이것은 정확히 어떻게되는지는 모르겠지만 실제로는 충분히 유사하므로 충분히 이해할 수 있습니다.

0

Eric LippertThe C# Programming Language 4th Edition 말한다 :

이 점은 초보자 자주 혼란 스럽다. " 값 유형이 참조 유형에서 파생되는 것이 가능한 이유는 무엇입니까?" "에서 파생되는"의미의 오해의 결과로 혼동이 발생한다고 생각합니다. 파생은 기본 유형의 메모리에있는 비트의 레이아웃이 파생 유형의 비트의 레이아웃에서 발견된다는 것을 의미하지 않습니다. 오히려, 기본 유형의 구성원이 파생 형식에서 액세스 될 수있는 메커니즘이 존재한다는 것을 의미합니다.

+3

명성이 5 점인 답변이 Present 인 경우 평판이 0 점인 답변을 표시하려면 어떤 위대한 아이디어가 필요합니까? 포인트를 얻는 데만 사용합니까? – Garry

+1

Gonul 케어 코멘트 하시겠습니까? – Garry

관련 문제