类型检查:typeof,GetType或是?

我见过很多人使用下面的代码:

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

但我知道你也可以这样做:

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

或这个:

if (obj1 is int)
    // Some code here

就我个人而言,我觉得最后一个是最干净的,但有什么我失踪? 哪一个最好用,还是个人喜好?


一切都不一样。

  • typeof需要一个类型名称(在编译时指定)。
  • GetType获取实例的运行时类型。
  • 如果实例位于继承树中, is返回true。
  • 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);
    

    typeof(T)呢? 它是否也在编译时解决?

    是。 T总是表达的类型。 请记住,通用方法基本上是一大堆适当类型的方法。 例:

    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"
    

    在编译时想要获取类型时使用typeof 。 如果您想在执行时获取类型,请使用GetType 。 几乎没有任何案例可以使用is因为它会演员阵容,并且在大多数情况下,最终您最终会投射变量。

    还有第四种选择,你没有考虑过(特别是如果你要将一个对象转换为你发现的类型); 那就是as

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

    这只使用一次演员,而这种方法:

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

    需要两个


    1。

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

    这是非法的,因为typeof只适用于类型,而不适用于变量。 我假设obj1是一个变量。 所以,typeof是静态的,并且在编译时而不是运行时工作。

    2。

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

    如果obj1正好是int类型,则这是真的。 如果obj1从int派生,则if条件将为false。

    3。

    if (obj1 is int)
    

    如果obj1是一个int,或者它来自一个名为int的类,或者它实现了一个名为int的接口,则这是真的。

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

    上一篇: Type Checking: typeof, GetType, or is?

    下一篇: defined type to a Oracle stored procedure