演習 - switch ステートメントを実装する
- 11 分
switch ステートメントは、if-elseif-else分岐コンストラクトの代替手段となる C# 選択ステートメントです。 switch ステートメントは、既知の一致する値のリストに対して 1 つの値を評価する場合に、if-elseif-else コンストラクトよりも優れた利点を提供します。
次のシナリオを考えてみましょう。
- あなたは、食品栄養に関連するアプリケーションに取り組んでいます。 コードのセクションでは、果物を扱います。
- コードには、さまざまな種類のフルーツの名前を保持するために使用される
fruitという名前の変数が含まれています。 - アプリケーションが重点を置く 20 個の果物の一覧があります。
fruitに割り当てられた値に基づいてコードを分岐する必要があります。
このシナリオでは、 switch ステートメントを使用して、フルーツの種類ごとに個別の分岐を作成できます。
switch ステートメントのしくみ
switchステートメントは、使用可能な switch セクションの一覧から実行するコードの 1 つのセクションを選択します。 選択した switch セクション は、ステートメントの match 式とのパターン一致に基づいて選択されます。
ステートメントの基本的な構造を示す次のコード サンプル switch 考えてみましょう。
switch (fruit)
{
case "apple":
Console.WriteLine($"App will display information for apple.");
break;
case "banana":
Console.WriteLine($"App will display information for banana.");
break;
case "cherry":
Console.WriteLine($"App will display information for cherry.");
break;
}
一致式 ( switch 式とも呼ばれます) は、 switch キーワードの後の値です(この場合は (fruit)。 各 スイッチ セクション は、 ケース パターンによって定義されます。 キーワード case に続けて値を付けることで、ケースパターンが作成されます。 この例の最初のケース パターンは、 case "apple":です。 ケース パターンは、 true または falseに評価されるブール式です。 各 switch セクションには、case のパターンが一致式と一致する場合に実行される少数のコード行が含まれています。 この例では、 fruit に "apple" の値が割り当てられている場合、最初のケース パターンは true として評価され、その switch セクションが実行されます。
switch ステートメントには少なくとも 1 つの switch セクションを含める必要がありますが、通常は 3 つ以上の switch セクションが含まれます。
スイッチは、次の場合に最適に使用されます。
- 1 つの値 (変数または式) があり、多くの可能な値と一致させる必要があります。
- 任意のマッチに対して、最大で数行のコードを実行する必要があります。
注
この switch ステートメントの最初の例は意図的に単純であり、構文の調査は簡単でした。 以下のセクションでさらに高度なシナリオを実行する場合は、 switch ステートメントの追加機能を確認します。
次に、コーディング環境を準備し、独自の switch ステートメントの開発を開始します。
コーディング環境を準備する
このモジュールには、デモ コードをビルドして実行するプロセスをガイドする実践的なアクティビティが含まれています。 開発環境として Visual Studio Code を使用して、これらのアクティビティを完了することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中のプロフェッショナルが使用する開発環境でコードの記述と実行をより快適に行うことができます。
Visual Studio Code を開きます。
Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[フォルダーを開く] ダイアログで、Windows の [デスクトップ] フォルダーに移動します。
コード プロジェクトを保持するフォルダーの場所が別にある場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。
[フォルダーを開く] ダイアログで、[フォルダーの選択] を選択します。
作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[はい] を選択します。
Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。
[ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 例えば次が挙げられます。
C:\Users\someuser\Desktop>注
サンドボックスやホスト環境ではなく、自分の PC で作業しており、この C# シリーズの他の Microsoft Learn モジュールを完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている可能性があります。 その場合は、[TestProject] フォルダーにコンソール アプリケーションを作成する次の手順をスキップできます。
ターミナル コマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、次のプロンプトを入力します。
dotnet new console -o ./CsharpProjects/TestProjectこの .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドでは、CsharpProjects および TestProject フォルダーが自動的に作成され、
.csprojファイルの名前として TestProject が使用されます。ファイルが既に存在することを示すメッセージが表示される場合は、次の手順に進みます。 既存のプロジェクト ファイルを再利用します。
エクスプローラー ビューで、 CsharpProjects フォルダーを 展開します。
TestProject フォルダーと、Program.cs という名前の C# プログラム ファイルと TestProject.csproj という名前の C# プロジェクト ファイルの 2 つのファイルが表示されます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[ フォルダーを開く ] ダイアログで、 CsharpProjects フォルダーを選択し、[フォルダーの選択] を 選択します。
エクスプローラー ビューで、TestProject フォルダーを展開し、 Program.csを選択します。
既存のコード行を削除します。
この C# コンソール プロジェクトを使用して、このモジュール中のコード サンプルを作成、ビルド、および実行します。
[ターミナル] パネルを閉じます。
switch ステートメントを作成してテストする
Visual Studio Code が開いていて、[エディター] パネルに Program.cs が表示されていることを確かめます。
注
Program.cs は空になっているはずです。 そうでない場合は、すべてのコード行を選択して削除します。
Visual Studio Code エディターに次のコードを入力します。
int employeeLevel = 200; string employeeName = "John Smith"; string title = ""; switch (employeeLevel) { case 100: title = "Junior Associate"; break; case 200: title = "Senior Associate"; break; case 300: title = "Manager"; break; case 400: title = "Senior Manager"; break; default: title = "Associate"; break; } Console.WriteLine($"{employeeName}, {title}");Visual Studio Code の [ファイル] メニューで、[保存] を選択します。
コードをビルドまたは実行する前に、Program.cs ファイルを保存する必要があります。
[エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、TestProject を右クリックし、[統合ターミナルで開く] を選択します。
[ターミナル] パネルが開きます。 ターミナルには、そのターミナルが TestProject フォルダーの場所で開いていることを示すコマンド プロンプトが含まれているはずです。
コードを実行するには、ターミナルのコマンド プロンプトで、「dotnet run」と入力し、Enter キーを押します。
注
"実行するプロジェクトが見つかりませんでした" というメッセージが表示された場合は、ターミナルのコマンド プロンプトに、予期されている TestProject フォルダーの場所が表示されていることを確かめます。 例:
C:\Users\someuser\Desktop\csharpprojects\TestProject>次の出力が表示されます。
John Smith, Senior Associate入力した
switchステートメントを確認するには、少し時間がかかります。switchステートメントで 1 つのコード ブロックが定義されていることに注意してください。switchステートメントは、switch セクションのリストを含む 1 つのコード ブロックを定義します。switchキーワードの右側には、かっこで囲まれた switch 式があります。コード ブロック内の switch セクションの一覧に注目してください。
switchコード ブロックにはスイッチ セクションの一覧が含まれており、それぞれに 1 つ以上のスイッチ ラベルが含まれています。 さらに、各 switch セクションには、ラベルが switch ステートメントの先頭で定義されている switch 式と等しい場合に実行されるステートメント リストが含まれています。switch 式は、case ラベルに対して上から下に評価され、switch 式と等しい値が見つかるまで続けられます。 一致するラベルがない場合は、
defaultケースのステートメント リストが実行されます。 既定値が含まれていない場合、制御は switch ステートメントのエンドポイントに転送されます。 各ラベルには、switch 式で指定された型と一致する値型を指定する必要があります。注
オプションの
defaultラベルは、スイッチ セクションのリスト内の任意の位置に表示できます。 ただし、ほとんどの開発者は、最終的なオプションとしてdefaultを配置する方が (論理的に) 理にかなっているため、最後に配置することを選択します。 位置に関係なく、defaultセクションは最後に評価されます。この例では次のようになります。
- switch 式は次の値です。
(employeeLevel) - 各スイッチ セクションには、1 つのスイッチ ラベル (
caseまたはdefault) があります。 - 一致するスイッチセクションは
case: 200によって定義されており、employeeLevel = 200がその理由です。
- switch 式は次の値です。
各スイッチ セクションが次のセクションから分離されていることに注意してください。
実行が許可される switch セクションは 1 つだけです。 つまり、スイッチ セクションの実行は、次の switch セクションに "フォールスルー" することは許可されません。
breakキーワードは、switch セクションを次のセクションに進む前に終了するいくつかの方法の 1 つです。breakキーワード (またはオプションでreturnキーワード) を忘れた場合、コンパイラーによってエラーが生成されます。
レベル変数の値を変更して switch ステートメントによるその評価方法を確認する
既定のケースを実行するには、値の割り当てを変更して従業員のレベルを変更しましょう。
employeeLevelに割り当てられている値を変更するには、次のようにコードを更新します。int employeeLevel = 201;コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。出力が変更されていることに注意してください。
これで、コードを実行すると、より汎用的なタイトルが使用されます。
John Smith, AssociateemployeeLevelはどのラベルにも一致しないため、defaultラベルが一致します。
スイッチ セクションを変更して複数のラベルを含める
たとえば、私たちの会社では、レベル 100 のすべての従業員にレベル 200 の従業員と同じタイトルである "シニア アソシエイト" というタイトルを付けることにしました。 開発者は、ラベル case 100:に属する最初の switch セクションを削除してこれを実装し、代わりに、 case 100: と case 200: の両方のラベルで同じスイッチ セクションを実行することを許可します。
employeeLevelに割り当てられている値を変更するには、次のようにコードを更新します。int employeeLevel = 100;最初の switch セクションに複数のラベルを割り当てるには、次のようにコードを更新します。
case 100: case 200: title = "Senior Associate"; break;変更が完了したら、変更は次のコードと一致する必要があります。
int employeeLevel = 100; string employeeName = "John Smith"; string title = ""; switch (employeeLevel) { case 100: case 200: title = "Senior Associate"; break; case 300: title = "Manager"; break; case 400: title = "Senior Manager"; break; default: title = "Associate"; break; } Console.WriteLine($"{employeeName}, {title}");コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。次の出力が表示されます。
John Smith, Senior Associate100と200の両方のケース ラベルが、タイトルを文字列値Senior Associate設定する switch セクションとペアになりました。
まとめ
switch ステートメントについて学習した主なポイントを次に示します。
switchステートメントは、一致する可能性が多い値が 1 つあり、各一致でコード ロジックに分岐が必要な場合に使用します。- コード ロジックを含む 1 つのスイッチ セクションは、
caseキーワードによって定義された 1 つ以上のラベルを使用して照合できます。 - 省略可能な
defaultキーワードを使用して、他のケース ラベルが一致しない場合に使用されるラベルとスイッチ セクションを作成します。