はじめに
なんとなく使っていたのですが、理解を深めるために改めて調べてみました。
記載しきれていないこともあるのですが、自分がよく使いそうなところをまとめました。
is演算子とは
左辺の変数が、右辺の型、もしくはパターンと互換性があるかチェックするもの。
C# 1.0
からずっとあるがちょっとずつ拡張されているようです。
// 型のチェック
int num = 10;
Console.WriteLine(num is int); // True
Console.WriteLine(num is long); // False
パターンマッチングでのis
C# 6
以前は型のチェックのみができたようですが、
C# 7
になり様々なパターン
と呼ばれるものとのチェックもできるようになりました。
パターンはいくつかあるのですが、中でも型パターン
と呼ばれるものをよく使うかと思います。
型パターン
C# 6
以前から使える型のチェックに加え、同時に変数の宣言もできるようになったものです。
型パターンを条件式で使用した場合には、変数のスコープが少し特殊になります。
括弧内のみで利用できるのが一般的かと思いますが、型パターンを利用すると、
変数を宣言した条件式を囲っているスコープ内で利用することができます。
object obj = 10;
if(obj is int num)
{
Console.WriteLine($"{num}です。"); // 10です。
}
else
{
// 使えるが、代入しないとエラー
num = 1;
Console.WriteLine($"ここでも使えます:{num}です。");
}
// 上記ifかelseで一度以上代入されるのでここでは代入せずに使える
Console.WriteLine($"ここでも使えます:{num}です。");
これは、早期リターンで利用したいという要望が多かったために実装されたようです。
便利ですね!
object obj = "moji";
if(!(obj is int n)){
return;
}
// 以降なにか処理
Console.WriteLine(n);
nullチェック
null許容型
の場合は、nullかどうかもチェックされ、
違う型だった場合と同様に、nullだった場合もFalse
と判断されます。
// null許容型でnullになっている場合
int? num = null;
Console.WriteLine(num2 is int); // False
Console.WriteLine(num2 is long); // False
// null許容型でnullではない場合
int? num2 = 10;
Console.WriteLine(num2 is int); // True
Console.WriteLine(num2 is long); // False
逆に、nullかどうかのみチェックしたい場合は、以下のようにします。
C# 9
以降では、not
という否定パターンが追加され、null以外かのチェックもシンプルにできます。
int? num = null;
Console.WriteLine(num3 is null); // True
// C# 9以降で実行可能
int? num2 = null;
Console.WriteLine(num2 is not null); // False
C# 11以降では
ちなみに11月8日に、.NET 7
が正式リリースされたようですが、
リストパターンなるものを使ってリスト内の各要素と一致しているかチェックできるようです。
int[] list = { 1, 2, 3, 4, 5 };
Console.WriteLine(list is [1, 2, ..]); // True
Console.WriteLine(list is [1, 2, .., 5]); // True
Console.WriteLine(list is [1, 2, _, _, 5]); // True
Console.WriteLine(list is [2, ..]); // False
Console.WriteLine(list is [1, 2, 3]); // False
参考サイト