asと()キャストの正しい使い分け方法

asキャストとは

C#ではCやC++にはなかったas演算子を使ってキャストをする機能が追加された。
使い方としてはキャストしたい対象のオブジェクトの後ろにasを付けるだけ。

SampleClass temp = object as SampleClass

キャスト後のふるまいは()でもasでも変わらない。

asと()キャストの違い

書き方の違いだけならどちら使ってもよいのでは?と思うかもしれないが、仕様も違うので正しく理解しておく必要がある

違い①:キャスト失敗時のふるまい

()キャストで失敗した場合、InvalidCastExceptionの例外が発生する。
そのためキャスト失敗する可能性があるのであればcatch処理を実装しておく必要がある。

try
{
SampleClass temp = object as SampleClass
}
catch (InvalidCastException)
{
  // エラー処理
}

ではasキャストの場合はどうかというと、例外は発生しない。
失敗した場合キャスト後のオブジェクトがnullになる仕様なのでnullチェックをすれば良い。

SampleClass temp = object as SampleClass
if (temp == null)
{
  // エラー処理
}

違い②:キャストできる対象のオブジェクト

もう1つの違いとしてasキャストは参照型のオブジェクトに対してしか適用できない。
そのためintやlong等の値型のオブジェクトではasは使えないので、キャスト時は()を使うしかない。

正しい使い分け方法

キャスト仕様の違いをふまえた上でではどのように使い分けたらよいのかというと、以下のように使い分けるのが良いと思う。

  • 値型の場合:()キャストを使う
  • 参照型の場合:asキャストを使う

理由としてはコードがシンプルになるからだ。
キャストというのは頻繁に使う処理なので、参照型に()キャストをしてすべてのキャストしている箇所に例外補足処理を入れるのはかなり面倒。しかも例外補足処理というのはよく忘れがちになることが多い。
それならasキャストでnullチェックをするだけの方がシンプルでラクだからだ。