Effective C# 3rd 読書メモ 03 キャストにはis/asを使う

C#におけるキャスト

C#には、強制的にキャストを行う方法と、as演算子を使ってキャストを行う方法とがある。

強制的なキャストは、キャスト失敗時にInvalidCastExceptionが発生する。
そのため、キャストをtry-catchで囲む必要があり、例外補足時には大きなコストが発生する。

object o = GetValue();

try
{
    MyType t;
    t = (MyType)o;
}
catch (InvalidCastException e)
{
    // キャスト失敗
}

as演算子は、キャストに失敗した場合はnullを返す。
強制的なキャストよりわずかに遅いが、例外処理のコストを考慮すると強制的なキャストよりも効率的である。

object o = GetValue();
MyType t o as MyType;

if (t != null)
{
    // キャスト成功
}
else
{
    // キャスト失敗
}

なお、asでキャストできるのは参照型のみで、int等の値型へはキャストできない。
ただし、以下のようにnullableへのキャストは可能である。

object o = GetValue();
var i = o as int?;
if (i != null)
{
    // キャスト成功
    Consolw.WriteLine(i.Value);
}

まとめると、

  • 原則として、asでキャストしてnullチェックする
  • asが使えない場合には、try-catchを使いつつ強制的なキャストを行う

参考:as 演算子と is 演算子を使用して安全にキャストする

コメントを残す

コメントを残す