1. ホーム
  2. c#

[解決済み] 型チェック:typeof、GetType、is?

2022-03-15 13:25:46

質問

以下のようなコードを使っている人を多く見かけます。

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) { 
    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);


についてはどうですか? typeof(T) ? これもコンパイル時に解決されるのでしょうか?

Tは常に、式の型が何であるかを表します。ジェネリックメソッドとは、基本的に適切な型を持つメソッドの束であることを忘れないでください。例を挙げましょう。

string Foo<T>(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<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"