switch-case 多分支选择

switch-case语句是C#中用于处理多分支选择的控制结构,特别适合处理基于单个变量的多个可能值的情况。本教程将详细介绍switch-case语句的语法、使用方法和最佳实践。

1. 概述

switch-case语句是一种多分支选择结构,用于根据表达式的值选择执行不同的代码块。与if-else if-else语句相比,switch-case在处理多个固定值时更加简洁和高效。

2. 基本语法

switch-case语句的基本语法如下:

switch (表达式)
{
    case 值1:
        // 当表达式等于值1时执行的代码
        break;
    case 值2:
        // 当表达式等于值2时执行的代码
        break;
    case 值3:
        // 当表达式等于值3时执行的代码
        break;
    default:
        // 当表达式不等于任何case值时执行的代码
        break;
}

其中:

  • 表达式:必须是一个可以求值为整数、字符、字符串或枚举类型的表达式
  • case:每个case后面跟着一个常量值,用于与表达式进行比较
  • break:用于退出switch语句,防止代码继续执行到下一个case
  • default:可选的,当没有匹配的case时执行

3. 基本用法示例

示例:根据星期几显示不同的消息

int dayOfWeek = 3; // 假设是星期三

switch (dayOfWeek)
{
    case 1:
        Console.WriteLine("星期一:开始新的一周");
        break;
    case 2:
        Console.WriteLine("星期二:工作继续");
        break;
    case 3:
        Console.WriteLine("星期三:一周过半");
        break;
    case 4:
        Console.WriteLine("星期四:期待周末");
        break;
    case 5:
        Console.WriteLine("星期五:周末即将到来");
        break;
    case 6:
        Console.WriteLine("星期六:享受周末");
        break;
    case 7:
        Console.WriteLine("星期日:准备新的一周");
        break;
    default:
        Console.WriteLine("无效的星期数");
        break;
}

4. 支持的数据类型

C#中的switch语句支持以下数据类型:

数据类型 示例 说明
整数类型 int, byte, short, long case值必须是整数常量
字符类型 char case值必须是字符常量
字符串类型 string case值必须是字符串常量
枚举类型 enum case值必须是枚举成员
布尔类型 bool C# 7.0+ 支持

5. 多个case共享代码块

当多个case需要执行相同的代码时,可以将它们放在一起,省略break语句:

示例:根据月份判断季节

int month = 6;
string season;

switch (month)
{
    case 12:
    case 1:
    case 2:
        season = "冬季";
        break;
    case 3:
    case 4:
    case 5:
        season = "春季";
        break;
    case 6:
    case 7:
    case 8:
        season = "夏季";
        break;
    case 9:
    case 10:
    case 11:
        season = "秋季";
        break;
    default:
        season = "无效的月份";
        break;
}

Console.WriteLine($"{month}月是{season}");

6. 字符串类型的switch-case

C#支持在switch语句中使用字符串类型:

示例:根据命令执行不同操作

string command = "save";

switch (command.ToLower())
{
    case "new":
        Console.WriteLine("创建新文件");
        break;
    case "open":
        Console.WriteLine("打开文件");
        break;
    case "save":
        Console.WriteLine("保存文件");
        break;
    case "exit":
        Console.WriteLine("退出程序");
        break;
    default:
        Console.WriteLine("未知命令");
        break;
}

7. 枚举类型的switch-case

枚举类型特别适合使用switch-case语句:

示例:根据颜色枚举显示信息

enum Color { Red, Green, Blue, Yellow }

Color selectedColor = Color.Green;

switch (selectedColor)
{
    case Color.Red:
        Console.WriteLine("红色:热情、危险");
        break;
    case Color.Green:
        Console.WriteLine("绿色:自然、安全");
        break;
    case Color.Blue:
        Console.WriteLine("蓝色:冷静、信任");
        break;
    case Color.Yellow:
        Console.WriteLine("黄色:快乐、警告");
        break;
    default:
        Console.WriteLine("未知颜色");
        break;
}

8. switch表达式(C# 8.0+)

C# 8.0引入了更简洁的switch表达式语法:

示例:使用switch表达式

int dayOfWeek = 3;

string message = dayOfWeek switch
{
    1 => "星期一:开始新的一周",
    2 => "星期二:工作继续",
    3 => "星期三:一周过半",
    4 => "星期四:期待周末",
    5 => "星期五:周末即将到来",
    6 => "星期六:享受周末",
    7 => "星期日:准备新的一周",
    _ => "无效的星期数"
};

Console.WriteLine(message);

9. 常见错误与注意事项

错误1:忘记break语句

错误示例

switch (x)
{
    case 1:
        Console.WriteLine("值为1");
        // 缺少break语句
    case 2:
        Console.WriteLine("值为2");
        break;
}

正确做法:每个case块(除了共享代码块的情况)都必须以break、return、goto或throw结束。

错误2:case值重复

错误示例

switch (x)
{
    case 1:
        Console.WriteLine("值为1");
        break;
    case 1: // 重复的case值
        Console.WriteLine("值还是1");
        break;
}

正确做法:每个case值必须是唯一的。

错误3:使用变量作为case值

错误示例

int value = 5;
int caseValue = 10;

switch (value)
{
    case caseValue: // 错误:case值必须是常量
        Console.WriteLine("匹配");
        break;
}

正确做法:case值必须是编译时常量。

10. 与if-else语句的比较

特性 switch-case if-else
适用场景 基于单个变量的多个固定值 复杂的条件表达式
可读性 在处理多个固定值时更清晰 在复杂条件时可能更直观
性能 通常更快(使用跳转表) 需要逐个判断条件
灵活性 只能比较相等性 支持各种比较运算符

11. 完整示例程序

下面是一个完整的示例程序,演示switch-case语句的各种用法:

using System;

namespace SwitchCaseExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 示例1:根据成绩显示等级
            Console.WriteLine("=== 成绩等级判断 ===");
            int score = 85;
            
            switch (score / 10)
            {
                case 10:
                case 9:
                    Console.WriteLine("优秀");
                    break;
                case 8:
                    Console.WriteLine("良好");
                    break;
                case 7:
                case 6:
                    Console.WriteLine("及格");
                    break;
                default:
                    Console.WriteLine("不及格");
                    break;
            }

            // 示例2:根据用户选择执行操作
            Console.WriteLine("\n=== 菜单选择 ===");
            Console.WriteLine("1. 新建文件");
            Console.WriteLine("2. 打开文件");
            Console.WriteLine("3. 保存文件");
            Console.WriteLine("4. 退出");
            
            int choice = 2; // 假设用户选择2
            
            switch (choice)
            {
                case 1:
                    Console.WriteLine("执行新建文件操作");
                    break;
                case 2:
                    Console.WriteLine("执行打开文件操作");
                    break;
                case 3:
                    Console.WriteLine("执行保存文件操作");
                    break;
                case 4:
                    Console.WriteLine("程序退出");
                    break;
                default:
                    Console.WriteLine("无效选择");
                    break;
            }

            Console.WriteLine("\n按任意键退出...");
            Console.ReadKey();
        }
    }
}

12. 总结

通过本教程,您应该已经掌握了C#中switch-case语句的完整使用方法。switch-case是处理多分支选择的强大工具,特别适合以下场景:

  • 基于单个变量的多个固定值进行选择
  • 需要处理枚举类型的情况
  • 菜单选择、状态机等应用场景

在使用switch-case时,需要注意以下几点:

  • 确保每个case块都有适当的退出语句(break、return等)
  • case值必须是编译时常量
  • 合理使用default分支处理未预料的情况
  • 在C# 8.0+中可以考虑使用更简洁的switch表达式

掌握switch-case语句的使用,将使您的代码更加清晰、高效和易于维护。