Type Checking: typeof, GetType, or is?

前端 未结 14 2273
北海茫月
北海茫月 2020-11-22 00:49

I\'ve seen many people use the following code:

Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

But I know you could also

14条回答
  •  迷失自我
    2020-11-22 01:20

    All are different.

    • typeof takes a type name (which you specify at compile time).
    • GetType gets the runtime type of an instance.
    • is returns true if an instance is in the inheritance tree.

    Example

    class Animal { } 
    class Dog : Animal { }
    
    void PrintTypes(Animal a) { 
        Console.WriteLine(a.GetType() == typeof(Animal)); // false 
        Console.WriteLine(a is Animal);                   // true 
        Console.WriteLine(a.GetType() == typeof(Dog));    // true
        Console.WriteLine(a is Dog);                      // true 
    }
    
    Dog spot = new Dog(); 
    PrintTypes(spot);
    

    What about typeof(T)? Is it also resolved at compile time?

    Yes. T is always what the type of the expression is. Remember, a generic method is basically a whole bunch of methods with the appropriate type. Example:

    string Foo(T parameter) { return typeof(T).Name; }
    
    Animal probably_a_dog = new Dog();
    Dog    definitely_a_dog = new Dog();
    
    Foo(probably_a_dog); // this calls Foo and returns "Animal"
    Foo(probably_a_dog); // this is exactly the same as above
    Foo(probably_a_dog); // !!! This will not compile. The parameter expects a Dog, you cannot pass in an Animal.
    
    Foo(definitely_a_dog); // this calls Foo and returns "Dog"
    Foo(definitely_a_dog); // this is exactly the same as above.
    Foo(definitely_a_dog); // this calls Foo and returns "Animal". 
    Foo((Animal)definitely_a_dog); // this does the same as above, returns "Animal"
    

提交回复
热议问题