developer tip

언제 어디서 GetType () 또는 typeof ()를 사용합니까?

copycodes 2020. 12. 10. 20:41
반응형

언제 어디서 GetType () 또는 typeof ()를 사용합니까?


이것이 작동하는 이유

if (mycontrol.GetType() == typeof(TextBox))
{} 

그리고 이것은하지 않습니까?

Type tp = typeof(mycontrol);

그러나 이것은 작동합니다

Type tp = mycontrol.GetType();

나는 is유형을 확인 하기 위해 연산자를 사용 하지만 내가 사용 typeof()하고GetType()

언제 어디서 사용 GetType()또는 typeof()?


typeof컴파일 타임에 알려진 유형 (또는 최소한 일반 유형 매개 변수) 을 가져 오는 연산자 입니다. 의 피연산자 typeof는 항상 유형 또는 유형 매개 변수의 이름이며 값 (예 : 변수)이있는 표현식이 아닙니다 . 자세한 내용은 C # 언어 사양 을 참조하세요.

GetType()개체의 실행 시간 유형 을 가져 오기 위해 개별 개체에 대해 호출하는 메서드 입니다.

(하위 클래스의 인스턴스가 아닌) 정확히 인스턴스 원하지 않는 한 TextBox일반적으로 다음을 사용합니다.

if (myControl is TextBox)
{
    // Whatever
}

또는

TextBox tb = myControl as TextBox;
if (tb != null)
{
    // Use tb
}

typeof컴파일 타임에 알려진 유형 또는 제네릭 유형 매개 변수의 이름에 적용됩니다. GetType런타임에 객체에서 호출됩니다. 두 경우 모두 결과는 유형 System.Type에 대한 메타 정보를 포함 하는 유형의 객체입니다 .

당신이 가지고 있다면

string s = "hello";

이 두 줄은 유효합니다

Type t1 = typeof(string);
Type t2 = s.GetType();

t1 == t2 ==> true

그러나

object obj = "hello";

이 두 줄은 유효합니다

Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType();  // ==> string!

t1 == t2 ==> false

즉, 변수의 컴파일 시간 유형 (정적 유형)이에서 obj참조하는 객체의 런타임 유형과 동일하지 않습니다 obj.


테스트 유형

그러나, 당신은 단지 알고 싶은 여부를 경우 mycontrol하는 TextBox당신은 테스트를 간단하게 할 수있는

if (mycontrol is TextBox)

이것은 완전히 동일하지는 않습니다.

if (mycontrol.GetType() == typeof(TextBox))    

mycontrol에서 파생 된 유형을 가질 수 있기 때문 입니다 TextBox. 이 경우 첫 번째 비교는 산출 true되고 두 번째 비교 false! 에서 파생 된 컨트롤 TextBoxTextBox가진 모든 것을 상속 하고 아마도 더 많은 것을 추가하고 따라서 할당과 호환되기 때문에 대부분의 경우 첫 번째 및 더 쉬운 변형은 괜찮습니다 TextBox.

public class MySpecializedTextBox : TextBox
{
}

MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox)       ==> true

if (specialized.GetType() == typeof(TextBox))        ==> false

주조

다음 테스트와 캐스트가 있고 T가 nullable이면 ...

if (obj is T) {
    T x = (T)obj; // The casting tests, whether obj is T again!
    ...
}

...로 변경할 수 있습니다.

T x = obj as T;
if (x != null) {
    ...
}

값이 주어진 유형인지, 캐스팅 (이 같은 테스트를 다시 포함)인지 테스트하는 것은 긴 상속 체인의 경우 시간이 많이 걸릴 수 있습니다. as연산자를 사용하고 테스트를 null수행하면 성능이 향상됩니다.

C # 7.0부터는 패턴 일치를 사용하여 코드를 단순화 할 수 있습니다.

if (obj is T t) {
    // t is a variable of type T having a non-null value.
    ...
}

Btw.: this works for value types as well. Very handy for testing and unboxing.


typeOf is a C# keyword that is used when you have the name of the class. It is calculated at compile time and thus cannot be used on an instance, which is created at runtime. GetType is a method of the object class that can be used on an instance.


You may find it easier to use the is keyword:

if (mycontrol is TextBox)

참고URL : https://stackoverflow.com/questions/11312111/when-and-where-to-use-gettype-or-typeof

반응형