![]() ![]() ![]() |
![]() |
||
![]() |
||
今回のコラムでは、キャストに関して説明します。 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演算子のほうがわかりやすいかもしれません。 このように、時と場合によって使い分ければいいでしょう。 |
||
前へ | ページトップへ | 次へ![]() |