2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

is 演算子 is 何?

Posted at

はじめに

なんとなく使っていたのですが、理解を深めるために改めて調べてみました。
記載しきれていないこともあるのですが、自分がよく使いそうなところをまとめました。

is演算子とは

左辺の変数が、右辺の型、もしくはパターンと互換性があるかチェックするもの。
C# 1.0からずっとあるがちょっとずつ拡張されているようです。

.cs
// 型のチェック
int num = 10;
Console.WriteLine(num is int); // True
Console.WriteLine(num is long); // False

パターンマッチングでのis

C# 6以前は型のチェックのみができたようですが、
C# 7になり様々なパターンと呼ばれるものとのチェックもできるようになりました。
パターンはいくつかあるのですが、中でも型パターンと呼ばれるものをよく使うかと思います。

型パターン

C# 6以前から使える型のチェックに加え、同時に変数の宣言もできるようになったものです。

型パターンを条件式で使用した場合には、変数のスコープが少し特殊になります。
括弧内のみで利用できるのが一般的かと思いますが、型パターンを利用すると、
変数を宣言した条件式を囲っているスコープ内で利用することができます。

.cs
object obj = 10;
if(obj is int num)
{
    Console.WriteLine($"{num}です。"); // 10です。
}
else
{
    // 使えるが、代入しないとエラー
    num = 1;
    Console.WriteLine($"ここでも使えます:{num}です。");
}
// 上記ifかelseで一度以上代入されるのでここでは代入せずに使える
Console.WriteLine($"ここでも使えます:{num}です。");

これは、早期リターンで利用したいという要望が多かったために実装されたようです。
便利ですね!

.cs
object obj = "moji";
if(!(obj is int n)){
    return;
}
// 以降なにか処理
Console.WriteLine(n);

nullチェック

null許容型の場合は、nullかどうかもチェックされ、
違う型だった場合と同様に、nullだった場合もFalseと判断されます。

.cs
// 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以外かのチェックもシンプルにできます。

.cs
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が正式リリースされたようですが、
リストパターンなるものを使ってリスト内の各要素と一致しているかチェックできるようです。

.cs
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

参考サイト

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?