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

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

SE
C#のisとasとはなんですか?

PM
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を利用するケースの方が多くなるでしょう。

SE
C#のisとasの使い方が分かりました。

PM
C#のisとasを使い分けなど理解を深めて、実際にコードを書いてみましょう。

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

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


FEnetへの登録は左下のチャットが便利です 経験者優遇! 最短10秒!

.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags