コーディングしている際にどうしてもキャストを使いたくなるケースってありますよね?
C#においては一般的に3パターンの実装方法があります
1. 通常キャスト
Animal animal = new Animal();
try
{
Cat cat = (Cat)animal;
// catを使った処理
}
catch (InvalidCastException)
{
// 処理失敗時の処理
}
class Animal { }
class Cat : Animal { }
2. as演算子を使用
Animal animal = new Animal();
Cat cat = animal as Cat;
if (cat != null)
{
// catを使った処理
}
class Animal { }
class Cat : Animal { }
3. is演算子を使用
Animal animal = new Animal();
if (animal is Cat cat)
{
// catを使った処理
}
class Animal { }
class Cat : Animal { }
ケースバイケースだとは思いますが、キャスト時は便利なis演算子を使うことをオススメします!
理由は以下の通りです
キャスト失敗時の例外リスク回避
通常のキャストの場合、キャストに失敗した際はInvalidCastException
が発生します
つまり、適切な箇所でtry-catchの実装が必要ということですね
その実装を失念するとプログラムが予期せず落ちるリスクが高まり、アプリケーションの安定性の低下を招くかも...
is演算子ではキャスト失敗時はif条件式がfalseになるだけなので例外発生の考慮は不要になります
Nullチェックが不要
as演算子を使用した場合、キャストに失敗した際はnullが返却されます
そのままnullチェックを行わずcat
を使用しようとするとNullReferenceException
の発生を招く可能性があります
つまり、as演算子を使う場合はキャスト後の値のnullチェックが必須になります
is演算子では値がnullの場合はキャスト失敗時同様にif条件式がfalseになるため、ブロック内の処理は実行されません
コードの簡潔さ
is演算子を使えば、上記のキャスト失敗判定、nullチェックに加えてキャスト後の変数宣言も同時に記述できます
ifの条件式内でキャストが成功すれば、変数cat
に勝手にキャスト後の値を代入してくれます
あとはifブロック内でcat
をそのまま使うだけですね!
まとめ
コードの記述量を見て貰えば一目瞭然ですが、is演算子を使うことによってかなり簡潔に実装できます
通常キャストやas演算子利用時より考慮すべき項目が少ないからということですね👍
複雑なエラーハンドリングが不要で、単純に型変換をしたいだけであれば便利な演算子なのでぜひ今後の選択肢の一つに!
参考