.NET ROOM.NET ROOMトップへCOMRADE総合トップへ
「2:イベントハンドラの登録と独自イベントの作成」へ

キャスト

 今回のコラムでは、キャストに関して説明します。
  C#やVB.NETなどのマネージドコードの言語では、型チェックが厳しく働くため、
たとえば次のようなコードはコンパイルエラーになります。

   // 不正なキャスト(コンパイルエラーになるケース)
   using System;
   class A { }
   class B { }
   class Test {
    static void Main() {
     A a = new A();
     B b = (B)a;
    }
   }

 しかしながら、ArrayListなど、主にコレクション系のクラスでは、object型のプロパティや、
引数を取るものがあり、実行時にキャストして使用する必要がある場合もあります。
その場合、間違ったキャストをしてもコンパイルエラーにはならず、
代わりにランタイムエラーとしてInvalidCastExceptionがThrowされます。

   // 不正なキャスト(ランタイムエラーになるケース)
   using System;
   using System.Collections;
   class Test {
    static void Main() {
     ArrayList al = new ArrayList();
     al.Add(1);
     al.Add("foo");
     int a = (int)al[0];
     string b = (string)al[1];
     string c = (string)al[0];
    }
   }

 try・・・catchで囲むという手もありますが、Exceptionの処理は比較的コストの高い処理(遅い処理)なので、
予期されるようなケースでの使用は控え、型チェックをして安全なキャストをするべきです。

 型チェックと安全なキャストのアプローチはC#の場合、2通りあります。

 ひとつ目は、is演算子を使用して、型をチェックした後にキャストする方法です。

   // is使用による安全なキャスト
   object o = "test";
   string s;
   if (o is string) {
    s = (string)o;
    s += "this";
    Console.WriteLine(s);
   }

 2つ目は、as演算子を使用する方法です。

   // as使用による安全なキャスト
   object o = "test";
   string s = o as string;
   if (o != null) {
    s += "this";
    Console.WriteLine(s);
   }

 as演算子を使用したキャストでは、型チェックが失敗した場合、nullが入るようになっています。

 どちらを使ってもたいして変わらない気がしますが、キャストしてすぐ使う場合には、
as演算子を使用するほうが、すっきりとしたコードになります。
ただし、is演算子を使用すると条件文が明確になるので、複雑な条件の場合には
is演算子のほうがわかりやすいかもしれません。
このように、時と場合によって使い分ければいいでしょう。


前へ | ページトップへ | 次へ