C〓〓9の新しい特性の強化のモードは一致します。


Intro
C〓〓9の中で更にモードマッチングの使用法を強化して、モードマッチングを更に強大にならせて、私達はいっしょに少し理解しましょう。
Sample
C((zhi 9)でモードマッチングの使い方が強化され、and/or/not操作子が追加され、属性を直接判断することができます。以下の例を見てください。

var person = new Person();

// or
// string.IsNullOrEmpty(person.Description)
if (person.Description is null or { Length: 0 })
{
  Console.WriteLine($"{nameof(person.Description)} is IsNullOrEmpty");
}

// and
// !string.IsNullOrEmpty(person.Name)
if (person.Name is not null and { Length: > 0 })
{
  if (person.Name[0] is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.')
  {
  }
}

// not
if (person.Name is not null)
{
}

ここのコードはDnSpyを使って逆コンパイルした後のコードは以下の通りです。

Person person = new Person();
string text = person.Description;
bool flag = text == null || text.Length == 0;
if (flag)
{
  Console.WriteLine("Description is IsNullOrEmpty");
}
text = person.Name;
bool flag2 = text != null && text.Length > 0;
if (flag2)
{
  char c = person.Name[0];
  if (c >= 'a')
  {
    if (c > 'z')
    {
      goto IL_8B;
    }
  }
  else if (c >= 'A')
  {
    if (c > 'Z')
    {
      goto IL_8B;
    }
  }
  else if (c != ',' && c != '.')
  {
    goto IL_8B;
  }
  bool flag3 = true;
  goto IL_8E;
  IL_8B:
  flag3 = false;
  IL_8E:
  bool flag4 = flag3;
  if (flag4)
  {
  }
}
bool flag5 = person.Name != null;
if (flag5)
{
}
スイッチ
これはisだけでなく、switchでも使えます。

switch (person.Age)
{
  case >= 0 and <= 3:
    Console.WriteLine("baby");
    break;

  case > 3 and < 14:
    Console.WriteLine("child");
    break;

  case > 14 and < 22:
    Console.WriteLine("youth");
    break;

  case > 22 and < 60:
    Console.WriteLine("Adult");
    break;

  case >= 60 and <= 500:
    Console.WriteLine("Old man");
    break;

  case > 500:
    Console.WriteLine("monster");
    break;
}

逆コンパイル後のコード:

int age = person.Age;
int num = age;
if (num < 22)
{
  if (num < 14)
  {
    if (num >= 0)
    {
      if (num > 3)
      {
        Console.WriteLine("child");
      }
      else
      {
        Console.WriteLine("baby");
      }
    }
  }
  else if (num > 14)
  {
    Console.WriteLine("youth");
  }
}
else if (num < 60)
{
  if (num > 22)
  {
    Console.WriteLine("Adult");
  }
}
else if (num > 500)
{
  Console.WriteLine("monster");
}
else
{
  Console.WriteLine("Old man");
}
More
いくつかの場合、多くのコードを簡略化することができます。特にif分岐が多い場合、上記のswitchを使うと、かなりはっきりしています。
しかし、string.IsNull OrEmptyのコードだけであれば、このように書かないほうがいいです。同僚に突っ込まれないように気をつけてください。
ヒョンテクは慎重にしてください。
Reference
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample
https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/PatternMatchingSample.cs
ここでC萼9の新特性の強化に関するモードマッチングに関する記事を紹介します。Cㄟ9のモードマッチングについては、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。