C#のクラスには継承という仕組みがあり、基底クラスを継承して新たな派生クラスを作成する事が可能です。派生クラスはアップキャストする事で基底クラスとして振る舞う事が出来るし、そこからダウンキャストして元のクラスの型へ変換する事も出来ます。
便利な仕組みですが、複雑なコードになると「このオブジェクトは安全に型変更できるのだろうか?」という場面に出くわす事になります。
そんな時に使うのが、typeof や is 演算子です。
どちらも型を判別する為のものですが、挙動が少し異なります。
両者の挙動の違いを理解してうまく使い分けましょう。
typeof
typeofを使うとインスタンスを作成したクラスが何かを判別出来ます。
正確に言うと typeof はクラス名から型宣言(Typeクラス)を取得するものです。
一方でobjectクラスには GetType() メソッドがあり自身の型宣言が取得出来ます。
両者を比較する事でそのオブジェクトがtypeofで指定したクラスなのかを判断します。
class Base {} class Level1 : Base{} class Level2 : Level1{} class Level3 : Level2{} class Test { static void Main() { Base obj = new Level2(); bool isBase = (typeof(Base) == obj.GetType()); // false bool isLevel1 = (typeof(Level1) == obj.GetType()); // false bool isLevel2 = (typeof(Level2) == obj.GetType()); // true bool isLevel3 = (typeof(Level3) == obj.GetType()); // false } }
is 演算子
is 演算子を使うとキャスト出来るかどうかをチェックできます。
typeofとは異なり基底クラス名で判断して場合 true が返ります。
class Base {} class Level1 : Base{} class Level2 : Level1{} class Level3 : Level2{} class Test { static void Main() { Base obj = new Level2(); bool isBase = (obj is Base); // true ←typeofと異なる bool isLevel1 = (obj is Level1); // true ←typeofと異なる bool isLevel2 = (obj is Level2); // true bool isLevel3 = (obj is Level3); // false } }
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください