가능한 중복 :
Type Checking: typeof, GetType, or is?GetType() 및 typeof()를 사용하여 Type을 가져 오는 것의 차이점은 무엇입니까?
유형을 얻을 수있는 좋은 방법은 어느 하나?
가능한 중복 :
Type Checking: typeof, GetType, or is?GetType() 및 typeof()를 사용하여 Type을 가져 오는 것의 차이점은 무엇입니까?
유형을 얻을 수있는 좋은 방법은 어느 하나?
typeof()
은 컴파일 타임에 해당 유형을 알고 있고 Type
객체를 얻으려는 경우에만 사용할 수 있습니다. 유형은 유형 매개 변수 T
이있는 클래스 내의 typeof(T)
과 같이 일반 유형 매개 변수 일 수 있지만 typeof
을 사용할 수있는 유형의 인스턴스가 필요하지 않습니다. typeof
의 피연산자는 항상 유형 또는 유형 매개 변수 인 입니다. 그것은 변수 나 그와 같은 것이 될 수 없습니다.
이제 이것을 object.GetType()
과 비교하십시오. 그러면 호출 된 객체의 실제 유형을 가져옵니다.
GetType
예기치 않은 줄 것이다 :한 가지 이상한 점 예를 들어, 다른 어셈블리의 내부 유형이 될 수있다 - 아무것도 실제 유형 코드에 액세스 할 필요가 없습니다에 GetType
)
GetType
에 대한 호출은 언제나 값 유형을 포함하는 복싱과 관련되며 nullable 값 유형의 박스 값은 null 참조 또는 nullable 값 유형의 인스턴스에 대한 참조입니다.GetType()은 런타임에 작동하며 typeof()는 컴파일 타임 연산자입니다.
그래서,
// untested, schematic
void ShowType(Object x)
{
Write(x.GetType().Name); // depends on actual type
// typeof(x) won't actually compile
Write(typeof(x).Name); // always System.Object
}
ShowType("test");
은 선택 System.String와하는 System.Object를 인쇄 할 수 있습니다.
더 좋은 예는 this question을 참조하십시오.
GetType은 Object의 가상 메서드입니다. 즉, 클래스의 인스턴스가 있으면 해당 Type 개체를 검색 할 수 있습니다.
typeof는 C# 연산자입니다.이 클래스는 컴파일 타임 조회를 수행하는 데 사용됩니다. 즉, 클래스 이름을 나타내는 기호가 있으면 그에 대한 Type 객체를 검색합니다.
는if (typeof(String) == "test".GetType())
그것은 정확히 같은 아니에요, 당신은 상속을 사용할 때 문제가 나타납니다.
즉,:
WebPage1
Page
에서 상속,이 사람이 Object
에서도 상속, 그래서 당신은 (new WebPage1()).GetType() == typeof(object)
을 테스트 할 경우 유형 개의 다른 있기 때문에이 false를 반환합니다,하지만 당신은 그것이 사실 년대 is
연산자를 사용하여 테스트 할 때. (new WebPage1())
또한 Page
와 object
유형 WebPage1
의 목적은,하기 때문에
((new WebPage1()) is object)
는 사실이다.
유형이 다를 수 있지만 is
은 으로 안전하게 전송할 수 있는지 확인합니다.
실제로 typeof는 인스턴스와 함께 사용할 수 없으므로 typeof (x)는 컴파일되지 않습니다. –
@Romain : 당신 말이 맞아요, 덧글을 추가했습니다. 당신은 Generic method를 사용하여 이것을 약간 설명 할 수 있습니다. –
typeof (인스턴스)가 컴파일되지 않습니까? – Gishu