[解決済み] 型チェック: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"
関連
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】pandasでカラムの種類を変更する
-
[解決済み】C#のyieldキーワードは何に使われるのか?
-
[解決済み】ActiveRecordのFloatとDecimalの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。