.NETエンジニア・プログラマ向けの技術情報・業界ニュースをお届けします。

  1. FEnet.NETナビ
  2. .NETコラム
  3. プログラミング言語
  4. C#
  5. C#のisとasとは?アップキャストとダウンキャスト・C# 7.0からはisでキャスト処理も同時に行える

C#のisとasとは?アップキャストとダウンキャスト・C# 7.0からはisでキャスト処理も同時に行える

  • C#
  • プログラミング言語
公開日時:   更新日時:
C#のisとasとは?アップキャストとダウンキャスト・C# 7.0からはisでキャスト処理も同時に行える
この記事でわかること
    基本情報技術者試験の試験対策はこちら>>

    システム
    エンジニア
    C#のisとasとはなんですか?

    プロジェクト
    マネージャー
    C#のisとas、それぞれの使用方法を紹介します。

    C#のisとasとは?基礎から解説します

    C#のisとasとは?

    C#のisとasは、キャストに関連した演算子です。そもそもキャストとは何なのでしょうか?例を挙げて説明しましょう。

    以下のようなプログラムを記述するとします。このプログラムでは、testという文字列をいったんobject型にして、また文字列に戻して表示しようとしています。このように型を変換することをキャストと言います。

    しかしこれを入力すると、「 string str = o;」の箇所で「型’object’を’string’に暗黙的に変換できません。明示的な変換が存在します」というエラーが出ます。

    アップキャストとダウンキャスト

    stringのtestをobjectのoにするのはエラーがでないのに、その逆はエラーになるのです。これはなぜでしょうか?それは、stringをobjectにするのはアップキャストで、objectをstringにするのはダウンキャストだからです。

    stringという型はobjectという型の下位のサブクラスです。つまりstringは子で、objectはその親になります。stringからobjectのように子から親に変換するのはアップキャスト、その逆はダウンキャストと言います。

    ダウンキャストは明示的に行う

    C#の子クラスは親クラスが実装している機能を全て含むため、「暗黙的に」アップキャストしても問題なく動作します。そのためエラーにはなりません。しかし子クラスは親クラスに無い機能があるので、ダウンキャストの場合は「明示的に」キャストする必要があります。

    明示的にダウンキャストするには、以下のC#サンプルのように”(クラス名)”を変換時に追加すれば可能です。こうすればエラーにはなりません。

    これを実行すると「テスト」と表示されます。

    ダウンキャストの危険性

    では明示的にダウンキャストすれば、常に問題はおこらないのでしょうか?実際はそうではありません。以下のC#サンプルを実行してみましょう。

    実行すると、「Unhandled exception. System.InvalidCastException: Unable to cast object of type ‘System.DateTime’ to type ‘System.String’.」という例外が「string str = (string)o;」の箇所で発生してしまいます。

    ダウンキャストの例外発生を防ぐには?

    DateTimeクラスとStringクラスは親子関係でないため、ダウンキャストできず例外が発生してしまうのです。このようなことが無いように気を付ける必要があります。

    しかし以下のC#サンプルのように、渡されるフィールドのクラスがわからない場合もあります。こういった場合はどのようにして例外を防げばいいのでしょうか。

    例外をキャッチする方法

    一つのやり方としては、例外が発生したらキャッチする方法です。以下のC#サンプルを実行すると「stringにダウンキャストできません」と表示されて、例外がcatch内で処理されていることがわかります。

    isを使う方法

    しかし実際は、そもそも例外を発生させたくない、発生するかどうかを事前に判断したいと思うケースが多いでしょう。その時に役立つのがis演算子なのです。

    以下のC#サンプルのやり方で事前に型を判定することができます。結果は「stringにダウンキャストできません」と表示されます。

    C# 7.0からはisでキャスト処理も同時に行える

    C# 7.0からはisで判定だけでなく、キャストできる場合はキャストした変数を宣言することも同時にできるようになりました。

    以下のC#サンプルはここまでのサンプルにあった「 string str = (string)o;」が不要になっています。

    asを使う方法

    今回のテーマのもう一方のas演算子についても解説します。ダウンキャストによる例外発生は、このasでも防ぐことが出来ます。

    以下のC#サンプルを実行してみましょう。

    asで例外発生は抑えられる

    上のC#サンプルはDispObjectメソッドにDateTime型が渡されています。これをasを使用してstringにキャストしています。ところが実行結果は何も表示されません。

    strはどうなっているのでしょうか?このサンプルのDispObjectを、以下のように修正してみましょう。

    isとasの使い分け

    上のC#サンプルの結果は「stringにダウンキャストできません」になります。つまり、asでキャストを行った場合、キャストできないとnullが代入されるということです。

    しかしasで例外発生を抑えられても、キャストした結果がnullになるのは困るというケースも多いでしょう。その場合は、asよりisを利用するケースの方が多くなるでしょう。

    システム
    エンジニア
    C#のisとasの使い方が分かりました。

    プロジェクト
    マネージャー
    C#のisとasを使い分けなど理解を深めて、実際にコードを書いてみましょう。

    C#のisとasを活用して例外発生を防ごう

    C#のisとasについて解説しましたが、ご理解頂けたでしょうか。どちらの演算子も例外を防ぐのにとても有効です。適切に使用して、エラーの無い高品質なプログラムを作り上げましょう。

    FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
    株式会社オープンアップシステムロゴ

    株式会社オープンアップシステムはこんな会社です

    秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
    数多くのエンジニアが集まります。

    秋葉原オフィスイメージ
    • スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。

    • 充実した研修制度

      充実した研修制度

      毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。

    • 資格取得を応援

      資格取得を応援

      スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。

    • 東証プライム上場企業グループ

      東証プライム上場企業グループ

      オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。

      安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。

    株式会社オープンアップシステムに興味を持った方へ

    株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。

    年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
    まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。

    株式会社オープンアップシステムへのご応募はこちら↓
    株式会社オープンアップシステムへのご応募はこちら↓

    C#新着案件New Job