こんにちは。皆さんはC#においてis演算子をどのくらい使っていますか?
入門時には変数の中身の型チェックに使う方法を習ったと思いますが、実はとっても便利な使い方があるんです。
今回は is 演算子の便利な使い方をいくつかご紹介します。
型チェックと代入
object? obj = GetValue(); if (obj is string str) { }
obj is string
の横に変数名を書くと型チェックの結果が true
なら変数に値の代入を行ってくれます。
null チェック
object? obj = GetValue(); if (obj is null) { }
通常は obj == null
と書いていると思いますが、is
を使うことができます。
何が違うかというと変数の型の ==
演算子がオーバーロードされていた場合、オーバーロードされたメソッドが実行されるため無駄な処理が行われる事になります。
ほとんどの場合は無意味ですが、is
を使うことにデメリットがないので is
にしておいた方が無難という感じです。
ちなみに obj != null
は obj is not null
です。
null チェックと代入
型チェックと代入 と同様に null でない場合に変数を代入する
処理を簡略化できます。
object? obj = GetValue(); if (obj is { } value) { }
これを応用することで以下の様に長ったらしい if 文を簡略化できます。
class Hoge { public HogeChild? child { get; set; } } class HogeChild { public int? Length { get; set; } } // ここからメソッドの中 Hoge? hoge = GetValue(); // 従来の記述 if (hoge != null && hoge.child != null && hoge.child.Length.HasValue) { Console.WriteLine(hoge.child.Length.Value); } // 簡略化した記述 if (hoge?.child?.Length is { } length) { Console.WriteLine(length); }
論理パターン
string text = GetValue(); // text の中身が 1~10 文字で先頭の文字が 'a' または 'b' または 'c’ の文字列かを確認 // 従来の記述 if (text.Length >= 1 && text.Length <= 10 && (text[0] == 'a' || text[0] == 'b' || text[0] == 'c')) { } // 簡略化した記述 if (text.Length is >= 1 and <= 10 && text[0] is 'a' or 'b' or 'c') { }
or
and
を使うことで同じ変数に対する比較を複数書く時に毎回変数を指定する必要がなくなります。
リストパターン
int[] value = GetValue(); // value の長さが 3 であり、中身が 1, 2, 3 の順番に値が入っている事を確認 // 従来の記述 if (value.Length == 3 && value[0] == 1 && value[1] == 2 && value[2] == 3)) { } // 簡略化した記述 if (value is [1, 2, 3]) { }
非常にシンプルに書くことができます。 特にテストコードでは配列の中身をチェックすることがよくあるので重宝すると思います。
論理パターン や _
を使うことでさらに柔軟に使うことができるようです。そちらについては後ほど紹介する Microsoft 様のページをご確認ください。
まとめ
今回は is 演算子でできる事の一部をご紹介しました。
ご紹介した記述を使いこなせば長ったらしくて読みにくい if 文もスッキリさせる事ができるかもしれません。
今回の内容は Microsoft 様の パターン マッチング - is および switch 式、パターン内の演算子 and、or、not - [Microsoft Learn] を参考にさせていただきましたので、興味を持っていただけた方はこちらも読んでみることをおすすめします。
おわりに
KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。
recruit.kentem.jp
career.kentem.jp