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を使いつつ強制的なキャストを行う