008. 型を変換してみよう

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

プログラム内で扱える型には様々あると紹介しました。基本的に型には互換性があるのですが、下位クラスに変換する時には何かしらデータが失われる可能性があるという注意点があります。
その際に型を変換する方法について紹介します。

型をキャストする

型を変換することをキャストするといいます。例えば小数点を扱うことができるfloatから小数点を扱うことのできないintに変換する時は、勢いで変換してしまおう!というのは許されていません。
逆に、小数点が扱えないintからサイズも大きく小数点が扱えるdoubleに変換する時は、勢いだけで変換する。変換するぞっていう命令なしに変換できちゃうのです。
例を見てみましょう。

float val1 = 123.45;
int val2 = (int)val1;
// val1 => 123.45
// val2 => 123

このように、型変換をする際は

([変換する型])[変換するオブジェクト]

といった感じに書けば、変換(キャスト)できます。
ただし、この場合、小数点が扱えないint型に変換したことで、小数点以下の数値が消えてしまいました。
このように、何かしらデータに悪影響を及ぼす場合、必ずキャストが必要になるのです。
逆に、悪影響を及ぼさない変換は、明示的に変換する必要はありません。

int val1 = 123;
double val2 = val1;
// val1 => 123
// val2 => 123

このように、val1からval2へ、intからdoubleに変換しましたが、データに悪影響は必ず及ぼさないのでエラーが起きることなくそのまま書くことができるのです。

asを使った変換

さて、先ほどの紹介は参照型・値型両方ともに使える変換方法です。参照型の場合はasを使った変換方法もあります。
このasを使った変換には以下のような特徴があります。

  • ([変換する型])[変換するオブジェクト] といった感じに変換するより高速
  • 変換できなくてもエラーが起きず、nullが返る
  • 参照型の変換にしか使えない

では例を見てみましょう。FileStreamクラスはStreamクラスから派生されたクラスなので、FileStreamからStreamに変換することができます。

// using System.IO; を指定すること。
FileStream fs = File.OpenRead("aaa.txt");
Stream stream = fs as Stream;

と、このように変換することができます。
また、FileStreamからFormに変換することはできません。(全く関係のないもの同士です)。ですが、このようなコードを書いてもコンパイルエラーは起きません。

// using System.IO; を指定すること。
FileStream fs = File.OpenRead("aaa.txt");
Form form = fs as Form;

コンパイルエラーは起きません…が、変換できないものなので、実際にこれを実行すると、Formに変換できないのでnullが返されます。
asの特徴の一つ、変換できない場合はnullが返るので、実行中にえらーが起きることがないですし、if文でf == nullならメッセージを出すみたいな条件分岐をしていしてあげればバグもわかりやすいですよね。