2010-12-27 4 views

답변

23

typeof()은 컴파일 타임에 해당 유형을 알고 있고 Type 객체를 얻으려는 경우에만 사용할 수 있습니다. 유형은 유형 매개 변수 T이있는 클래스 내의 typeof(T)과 같이 일반 유형 매개 변수 일 수 있지만 typeof을 사용할 수있는 유형의 인스턴스가 필요하지 않습니다. typeof의 피연산자는 항상 유형 또는 유형 매개 변수 인 입니다. 그것은 변수 나 그와 같은 것이 될 수 없습니다.

이제 이것을 object.GetType()과 비교하십시오. 그러면 호출 된 객체의 실제 유형을 가져옵니다.

  • 당신은 컴파일시 타입을 알 필요가 없습니다 (보통 당신은하지 않습니다) 그렇지 않으면 당신은 가지고 (당신은이 형식의 인스턴스가있을 필요합니까
  • : 이는 GetType 예기치 않은 줄 것이다 :

한 가지 이상한 점 예를 들어, 다른 어셈블리의 내부 유형이 될 수있다 - 아무것도 실제 유형 코드에 액세스 할 필요가 없습니다에 GetType)

  • 를 호출 없습니다 답변 권투가 작동하는 방식으로 인해 nullable 값 유형에. GetType에 대한 호출은 언제나 값 유형을 포함하는 복싱과 관련되며 nullable 값 유형의 박스 값은 null 참조 또는 nullable 값 유형의 인스턴스에 대한 참조입니다.

  • 7

    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을 참조하십시오.

    +4

    실제로 typeof는 인스턴스와 함께 사용할 수 없으므로 typeof (x)는 컴파일되지 않습니다. –

    +0

    @Romain : 당신 말이 맞아요, 덧글을 추가했습니다. 당신은 Generic method를 사용하여 이것을 약간 설명 할 수 있습니다. –

    +0

    typeof (인스턴스)가 컴파일되지 않습니까? – Gishu

    2

    GetType은 Object의 가상 메서드입니다. 즉, 클래스의 인스턴스가 있으면 해당 Type 개체를 검색 할 수 있습니다.

    typeof는 C# 연산자입니다.이 클래스는 컴파일 타임 조회를 수행하는 데 사용됩니다. 즉, 클래스 이름을 나타내는 기호가 있으면 그에 대한 Type 객체를 검색합니다.

    if (typeof(String) == "test".GetType()) 
    
    0

    그것은 정확히 같은 아니에요, 당신은 상속을 사용할 때 문제가 나타납니다.

    즉,:

    WebPage1Page에서 상속,이 사람이 Object에서도 상속, 그래서 당신은 (new WebPage1()).GetType() == typeof(object)을 테스트 할 경우 유형 개의 다른 있기 때문에이 false를 반환합니다,하지만 당신은 그것이 사실 년대 is 연산자를 사용하여 테스트 할 때. (new WebPage1()) 또한 Pageobject 유형 WebPage1의 목적은,하기 때문에

    ((new WebPage1()) is object)는 사실이다.

    유형이 다를 수 있지만 is은 으로 안전하게 전송할 수 있는지 확인합니다.