Type Checking: typeof, GetType, or is?

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 do this:

if (obj1.GetType() == typeof(int))
    // Some code here

Or this:

if (obj1 is int)
    // Some code here

Personally, I feel the last one is the cleanest, but is there something I'm missing? Which one is the best to use, or is it personal preference?


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) { 
        print(a.GetType() == typeof(Animal)) // false 
        print(a is Animal)                   // true 
        print(a.GetType() == typeof(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>(T object) { return typeof(T).Name; }
    
    Animal probably_a_dog = new Dog();
    Dog    definitely_a_dog = new Dog();
    
    Foo(probably_a_dog); // this calls Foo<Animal> and returns "Animal"
    Foo<Animal>(probably_a_dog); // this is exactly the same as above
    Foo<Dog>(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<Dog> and returns "Dog"
    Foo<Dog>(definitely_a_dog); // this is exactly the same as above.
    Foo<Animal>(definitely_a_dog); // this calls Foo<Animal> and returns "Animal". 
    Foo((Animal)definitely_a_dog); // this does the same as above, returns "Animal"
    

    Use typeof when you want to get the type at compilation time. Use GetType when you want to get the type at execution time. There are rarely any cases to use is as it does a cast and, in most cases, you end up casting the variable anyway.

    There is a fourth option that you haven't considered (especially if you are going to cast an object to the type you find as well); that is to use as .

    Foo foo = obj as Foo;
    
    if (foo != null)
        // your code here
    

    This only uses one cast whereas this approach:

    if (obj is Foo)
        Foo foo = (Foo)obj;
    

    requires two .


    1.

    Type t = typeof(obj1);
    if (t == typeof(int))
    

    This is illegal, because typeof only works on types, not on variables. I assume obj1 is a variable. So, in this way typeof is static, and does its work at compile time instead of runtime.

    2.

    if (obj1.GetType() == typeof(int))
    

    This is true if obj1 is exactly of type int. If obj1 derives from int, the if condition will be false.

    3.

    if (obj1 is int)
    

    This is true if obj1 is an int, or if it derives from a class called int, or if it implements an interface called int.

    链接地址: http://www.djcxy.com/p/20288.html

    上一篇: 从C#到Oracle存储过程的重要参数

    下一篇: 类型检查:typeof,GetType或是?