C# Switch Expression Explained:ティム・コーリーによる実践ガイド
C#開発の世界では、クリーンで保守性の高いコードを書くことが重要な目的です。C#の最新機能として、従来のswitch文に代わるコンパクトで強力なswitch式があります。 見過ごされがちですが、switch式は、特にリレーショナルパターン、パターンマッチ、定数パターンを扱うときに、複雑な分岐ロジックを単純化します。
この機能がどのように機能し、従来のアプローチとどのように比較されるかをよりよく理解するために、ティム・コーリー氏による役立つビデオを紹介します。 Switch Expressions In C#"のビデオを通して、ティムはC#におけるswitch式の実際の使い方を説明し、より少ない行数でより良いコードを書く方法を示します。
採点例から始まり、インターフェース、型パターン、オブジェクト評価などを使って、より高度なシナリオへと発展していくティムの実践的な説明に飛び込もう。
伝統的な If-Else と Switch 式の比較
Timは、numberGradeというint変数が85のようなテストのスコアを保持するコンソール・アプリケーションから始めます。目標は、この数値入力値を"B"のような対応する文字の評点に変換することです。 ほとんどの場合、開発者は次のような一連のif-else文やswitch文を使用します:
if (numberGrade >= 90)
letterGrade = "A";
else if (numberGrade >= 80)
letterGrade = "B";
// ...and so onif (numberGrade >= 90)
letterGrade = "A";
else if (numberGrade >= 80)
letterGrade = "B";
// ...and so onこれは効果的ですが、冗長です。 一方、C#のスイッチ式は、よりすっきりとした構文を提供します。
採点のためのスイッチ式を書く
switch式を示すために、Timは以下のコードを使って上記のロジックを書き換えます:
string letterGrade = numberGrade switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};string letterGrade = numberGrade switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};ここでは、switchキーワードが、文ではなく、表現として、新しい文脈で使用されています。 これは、値が直接評価され、変数(letterGradeのような)に代入できることを意味します。
この書式は関係パターン(例: >= 90)をサポートし、最終的な else に相当するデフォルトのケースを処理するために破棄パターン(˶_˶)を使用します。
ティムは、コンパイラーは実行時にマッチを決定し、各条件をトップダウンでチェックし、入力に合う最初のパターンを選択すると述べている。
式を使用してコードを簡素化する
ティムの言葉を借りれば、この新しい構文は "多くのコードを置き換える "ものだ。else ifで条件を繰り返す代わりに、switch式は明確で簡潔な構造ですべてを処理します。 これにより、制御フローが簡素化され、可読性が向上し、ロジックの冗長性が減少します。
彼は、この構造は、入力値を採点、ステータスメッセージ、データ変換のような特定の出力にマッピングする場合に特に有用であることを強調している。
オブジェクト型でパターンマッチングを使用する
型パターンとパターン・マッチングを探求するために、Tim は IAnimal インターフェースを含むシナリオを紹介します。 Dog、Cat、Cowの3つのクラスを定義し、それぞれがインターフェイスを実装している。 このため、彼は、それぞれ異なる特性を持つ動物のリストを作成することができます。
interface IAnimal { }
record Dog(string Name) : IAnimal;
record Cat(string Title, string Name) : IAnimal;
record Cow(string Breed) : IAnimal;interface IAnimal { }
record Dog(string Name) : IAnimal;
record Cat(string Title, string Name) : IAnimal;
record Cow(string Breed) : IAnimal;さまざまな動物のインスタンスをリストに入力し、型パターン・マッチングを使用してオブジェクトの型を識別し、データを抽出する方法を示します。
パターンマッチングを使用したスイッチ表現
Timは、if文を使って次のコードをどのように記述するかを示しています:
if (a is Dog d)
message = $"Dog: {d.Name}";
else if (a is Cat c)
message = $"Cat: {c.Title} {c.Name}";
else if (a is Cow co)
message = $"Cow: {co.Breed}";
else
message = "Unknown animal";if (a is Dog d)
message = $"Dog: {d.Name}";
else if (a is Cat c)
message = $"Cat: {c.Title} {c.Name}";
else if (a is Cow co)
message = $"Cow: {co.Breed}";
else
message = "Unknown animal";よりコンパクトで読みやすいスイッチ表現に置き換えることができます:
string message = a switch
{
Dog d => $"Dog: {d.Name}",
Cat c => $"Cat: {c.Title} {c.Name}",
Cow co => $"Cow: {co.Breed}",
_ => "Unknown animal"
};string message = a switch
{
Dog d => $"Dog: {d.Name}",
Cat c => $"Cat: {c.Title} {c.Name}",
Cow co => $"Cow: {co.Breed}",
_ => "Unknown animal"
};この式はオブジェクトの型をチェックし、マッチしたパターンに基づいて正しい出力を適用します。 一致するものがない場合は、discard ︓を使⽤してデフォルトの結果にフォールバックします。
この機能は、わかりやすさを犠牲にすることなく、機能性を高めます。 実行時の動作は予測可能で読みやすいままです。
whenキーワードでのオプションガード
Timの例では実演されていませんが、switch式はwhenキーワードで拡張して、オプションのブーリアン条件を適用できることに注意することが重要です:
int score = 90;
string result = score switch
{
int s when s >= 90 && s <= 100 => "Excellent",
int s when s >= 75 => "Good",
_ => "Needs Improvement"
};int score = 90;
string result = score switch
{
int s when s >= 90 && s <= 100 => "Excellent",
int s when s >= 75 => "Good",
_ => "Needs Improvement"
};ここでは、when節により、より複雑なブーリアン式を使用して、引数をカスタム評価することができます。
ベストプラクティスと最終的な考え
Switch式はコードをよりコンパクトにしますが、コンパクトだからといって必ずしも優れているとは限りません。 特に複雑なロジックや不明確な入力では、従来のswitch文やifブロックの方が適切な場合もあります。
すべてのケースでスイッチ式を使用する必要はありません。 これは、ティムが冗談で言うような"スイッチ・カルト"に参加することではありません。 それは、保守可能で理解しやすいコードをシステムで書くためです。
概要: 開発者のツールボックスにスイッチ式を追加する
C#スイッチ式は、定数、リレーショナル、および型パターンの組み合わせを使用して、入力パターンに基づいて値を評価し、返すためのモダンでクリーンな方法を提供します。 ロジックを単純化し、定型文を減らし、読みやすさを向上させたい場合に最適です。
整数の等級付けから動物のオブジェクトの識別まで、ティム・コリーのビデオにある以下の例は、その実用的な使い方を強調しています。 結果を計算する関数を構築する場合でも、ユーザー入力を処理する場合でも、nullや未定義のケースを扱う場合でも、switch式は時間を節約し、エラーを減らし、コードベースを管理しやすくするのに役立ちます。
ティムが言うように、"これらのツールは、あなたのコードをよりシンプルでクリーンなものにし、なおかつ、それ以上ではないにせよ、理解しやすいものにするために、あなたのツールボックスにあると本当に便利なツールです"。
C#コードの品質を向上させ、.NET Coreの技術革新に遅れを取らないようにするには、switch式をスキップしないでください。 あなたのVisual Studioプロジェクトで試してみてください。

