息抜き C# ~ New Normal なコードの書き方:第01回「is演算子による型変換」 ~

f:id:ecb_smiyahara:20210303205802j:plain

こんにちはecbeingでアーキテクトをやっている宮原です。

今日は New Normal なコードの書き方 の第01回目、「is演算子による型変換」について説明させていただきます。


本記事は 息抜きC# 記事の第01回目です。
第00回目「新しいC#の機能達」はこちら。

保守的な型変換

C#で、ある変数を安全に型変換したいと思った場合、is演算子を使う派と as演算子を使う派がいると思います。

【is演算子】
// ParentA と ChildA は親子
ParentA Pa = new ChildA();

if (Pa is ChildA)
{
    ChildA Ca = (ChildA)Pa;
    Console.WriteLine(Ca.GetType().FullName);
}

is演算子を使う場合、まず変換可能であるかの判定を行います。
そしてその後変換可能であればキャストを行います。

【as演算子】
// ParentA と ChildA は親子
ParentA Pa = new ChildA();

ChildA Ca = Pa as ChildA;
if (Ca != null)
{
    Console.WriteLine(Ca.GetType().FullName);
}

as演算子を使う場合は、まず先に型変換を行います。
その後変換が成功したかどうかを確認します。

どちらも順序の前後はあるものの、型変換と判定は別々に行っています。
書く手間も読みやすさもあまり変わりありません。

新しい型変換

型変換と判定を一緒にしてくれればもっとスマートに書けるのに・・・と誰かが考えたのでしょう。is演算子の機能に拡張が加わりその望みが叶うようになりました。

【拡張されたis演算子】
// ParentA と ChildA は親子
ParentA Pa = new ChildA();

if (Pa is ChildA Ca)
{
    Console.WriteLine(Ca.GetType().FullName);
}

旧来の「Pa is ChildA」という判定文を「Pa is ChildA Ca」という書き方にすることよって、

  1. 「Pa は ChildA に変換可能か?」という判定
  2. 「Pa をChildA型にキャストする」という処理
  3. 「キャストした値で変数 Ca を初期化する」という処理

が全て表現できることになります。
式「Pa is ChildA Ca」は従来の「Pa is ChildA」と同様、変換可能であれば true を返すので、if文の true 側ブロック内では変換された変数「Ca」が安全に使用可能です。

地味に便利

あまり大きな機能に思えないかもしれませんが、型変換はDBから値を取得したり、外部通信の値をデシリアライズしたりするときにはわりと頻繁に発生する処理です。

この書き方を身につけると、型変換のコードがちょっとスマートになること請け合いです。

第02回目「swtich式」はこちら。

ecbeingではちょっとスマートなスタイルを身に着けたいエンジニアを募集しています!!

careers.ecbeing.tech