C#的Switch语句(在C#中如何根据结果执行不同的代码)

news2024/11/24 3:38:29

文章目录

  • 基本语法
    • 示例
  • 注意
  • 使用goto
    • 跳转其他标签

基本语法

switch语句是一种选择结构,用于基于某个表达式的值执行不同的代码块。它提供了一种更简洁、更易读的方式来处理多路分支逻辑,相比于多个嵌套的if…else if…else语句。下面是switch语句的基本语法和用法说明:

switch (expression)
{
    case constantExpression1:
        // 执行的代码块1
        break;
    case constantExpression2:
        // 执行的代码块2
        break;
    // ... 可以有更多case语句
    default:
        // 如果没有匹配的case,执行这里的代码块(可选)
        break;
}

expression: 这是一个要评估的表达式,其结果会与各个case标签后的常量表达式进行比较。

constantExpression1, constantExpression2, ...: 这些是与expression结果比较的常量值。

switch语句的测试限于离散的值。

离散的值,指的是在一个集合或数列中,各数值之间彼此独立,不存在介于两者之间的其他可能值,这样的值我们称之为离散值。换句话说,离散值不构成连续的序列,它们是可数的,且是彼此分离的,没有无限细分的可能。

比如说,骰子掷出的点数,当掷一个标准的六面骰子时,可能的结果是1、2、3、4、5、6,这些都是离散的值,因为不存在介于这些整数之间的结果。

或者学生的班级排名,比如在一个班级里,学生按照成绩排名,第1名、第2名、……直到第n名,这些排名是离散的,你不能有“第1.5名”。

又或者足球比赛的进球数,一场足球比赛结束时,一支队伍可能进0球、1球、2球等,这些进球数是明确可数的,不存在0.5个进球这样的情况。

这意味着它只能用来比较表达式的值是否与预定义的一系列具体的值相等。这些值可以是整数、字符、枚举值,或者在C# 7.0及以后版本中,case标签也可以是字符串元组、以及使用when子句进行更复杂的条件检查。模式匹配功能允许更复杂的模式,包括类型模式和属性模式等。这让switch能够处理更广泛的情况,但核心上仍然是基于离散值或明确的匹配条件来进行判断。

注意,仅限于离散值,也就是说你不能直接用switch来测试一个范围内的值(比如年龄是否在18到65之间),或者浮点数的精确相等(因为浮点运算可能存在误差),而是需要将这类连续的或非精确的比较转化为对离散值的检查,比如通过区间划分成具体的 case。

  • break: 当匹配到一个case后,执行相应代码块,然后遇到break会跳出switch语句。如果不写break,则会继续执行下一个case,这称为“贯穿”(fall through)。
  • default: 这是一个可选的标签,表示如果没有case匹配到expression的结果时执行的代码块。

示例

        int dayOfWeek = (int)DateTime.Now.DayOfWeek;
        switch (dayOfWeek)
        {
            case 1:
                Console.WriteLine("星期一");
                break;
            case 2:
                Console.WriteLine("星期二");
                break;
            case 3:
                Console.WriteLine("星期三");
                break;
            // ...
            default:
                Console.WriteLine("这是一个周末或其他未指定的日子");
                break;
        }

注意

每个case标签后面的代码块可以为空,但如果有执行语句,则通常需要跟随一个break来防止贯穿,如下所示。

        int age=2;
        switch (age)
        {
            case 1:
                // 执行的代码块1
                break;
            case 2:
            default:
                // 如果没有匹配的case,执行这里的代码块(可选)
                break;
        }

default部分可以位于switch语句的任何位置,但习惯上放在最后。

使用goto

在C#中,switch语句主要用于基于不同的条件执行不同块的代码,而goto语句提供了一种无条件跳转的机制。虽然在C#中使用goto是合法的,但在switch语句内部使用它并不是典型的做法,因为C#提供了更结构化的控制流机制,如breakcontinue、以及模式匹配(在C# 7.0及以上版本中增强的switch语句)。

不过你还是可以在C#的switch语句外部使用goto来改变控制流程,包括跳过switch块或跳转到特定的代码段。但请注意,过度依赖goto可能会导致代码难以阅读和维护。

下面的C#示例展示了一个非常规的用法,其中goto用于在switch外部跳过部分代码块,但请注意这并非推荐的编码规范:

    static void Main()
    {
    StartMenu:
        Console.WriteLine("\n欢迎来到导航示例!");
        Console.WriteLine("请选择一个选项:");
        Console.WriteLine("1. 转到信息板块");
        Console.WriteLine("2. 转到行动板块");
        Console.WriteLine("3. 退出");

        string input = Console.ReadLine();
        if (!int.TryParse(input, out int choice) || choice < 1 || choice > 3)
        {
            Console.WriteLine("无效的选择。请重试。");
            goto StartMenu; // 返回开始菜单
        }

        switch (choice)
        {
            case 1:
                goto InformationSection;
            case 2:
                goto ActionSection;
            case 3:
                Console.WriteLine("正在退出程序。再见!");
                return;
            default:
                // 这里实际上不会被执行,因为前面已经做了检查,但为了完整性保留
                break;
        }

    InformationSection:
        Console.WriteLine("\n--- 信息板块 ---");
        Console.WriteLine("在这里您可以找到详细信息。");
        Console.WriteLine("按任意键返回菜单。");
        Console.ReadKey();
        goto StartMenu; // 返回开始菜单

    ActionSection:
        Console.WriteLine("\n--- 行动板块 ---");
        Console.WriteLine("在这里您可以执行操作。");
        Console.WriteLine("按任意键返回菜单。");
        Console.ReadKey();
        goto StartMenu; // 返回开始菜单
    }

在这里插入图片描述

跳转其他标签

        int action = 1; // 示例中的动作选择

        switch (action)
        {
            case 1:
                Console.WriteLine("执行动作1的逻辑...");
                goto case 2; // 从case 1跳转到case 2,不推荐的做法
            case 2:
                Console.WriteLine("执行动作2的逻辑...");
                break;
            case 3:
                Console.WriteLine("执行动作3的逻辑...");
                break;
            default:
                Console.WriteLine("未定义的动作。");
                break;
        }

在这个示例中,如果action变量的值为1,程序会在执行完case 1的逻辑后,通过goto case 2;直接跳转到case 2继续执行,绕过了正常的流程控制。这种方式虽然可行,但降低了代码的清晰度和可维护性。通常,我们应当在每个case块末尾使用break来更清晰地控制程序的流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++语法07 程序中的除法和求余

程序中的除法 int / int int double / int double int / double double double / double double 规律总结 只要除号任意一边出现了double类型&#xff0c;结果就是double类型 只有除号两边都是int类型&#xff0c;结果才是int类型 这个规律也适用于加法减法和乘法 …

Mybatis框架中结果映射resultMap标签方法属性收录

Mybatis框架中结果映射resultMap标签收录 在MyBatis框架中&#xff0c;resultMap 是一种强大的机制&#xff0c;用于将数据库结果集映射到Java对象上。它允许你定义如何将查询结果中的列映射到Java对象的属性上&#xff0c;尤其是当数据库表的字段名与Java对象的属性名不一致时…

python全栈开发《07.数据类型之数字类型的应用、初识字符串类型》

目录 一、数字类型的简单应用二、初识字符串 1.什么是字符串2.字符串的内置函数与定义方法3.字符串的重要思想 三、python的内置函数id和len 一、数字类型的简单应用 对int与float的简单应用练习–初中生春游&#xff0c;主人公小编。 1.起因 小编学校组织春游&#xff0c;…

智能驾驶时代:车联网需要怎样的智能网络底座?

2024年&#xff0c;智能驾驶市场火热&#xff0c;无论是造车新势力还是老牌车企纷纷发力智能驾驶&#xff0c;他们深知&#xff0c;新能源汽车的下半场已到&#xff0c;再不发力智能驾驶&#xff0c;可能真的有些来不及了。车企不断加码单车智能的同时&#xff0c;政府也在稳步…

关于BERT和embedding

embedding到一个低维向量&#xff0c;但是需要回到onehot高维表示&#xff0c;所以大部分填词游戏最后都需要加上一个MLP接头。 word2vec如此简单的结构&#xff0c;学习到的是embedding 基于计数的统计方法和word2vec融合就形成了glove词嵌入模型 总结&#xff1a;通过各种…

FL Studio21.2.9最新中文永久激活码注册码

FL Studio21中文版本激活码注册码&#xff0c;这个好东西我真的要给大家种草一下&#xff01;&#x1f331; 让我来给大家介绍一下这款神奇的软件吧&#xff01;FL Studio21是一款非常专业的音乐制作软件&#xff0c;功能强大到让人惊叹&#xff01;&#x1f60d; 它可以帮助音…

AI预测福彩3D采取888=3策略+和值012路或胆码测试6月15日新模型预测第5弹

今天咱们继续验证新模型的8码定位3&#xff0c;目前新模型新算法8码定位经过4次测试&#xff0c;已命中3次&#xff0c;9码定位连续命中4次。咱们重点是预测8码定位3&#xff0b;和值012胆码。有些朋友看到我最近几篇文章没有给大家提供缩水后的预测详情&#xff0c;在这里解释…

使用docker构建自己的镜像并推送到远程镜像仓库

这里镜像仓库使用阿里云仓库&#xff0c;其他仓库可能类似&#xff0c;可以参考&#xff0c;个人实例可以免费使用。 背景 遇到的问题&#xff1a;需要定制一个自己的镜像&#xff0c;在上面安装一些环境&#xff0c;然后将镜像托管到公共镜像仓库&#xff0c;在其他地方使用…

什么是快乐?

什么是快乐&#xff1f; What is Happiness? 1. 快乐不是追求外在的物质&#xff0c;而是内心的平静与满足。当我们学会感恩&#xff0c;懂得珍惜眼前的一切&#xff0c;心中自然会充满喜悦。快乐并非来自拥有更多&#xff0c;而是感受到已经拥有的足够。每一天都怀抱感激之情…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形&#xff0c;可用于圆的定位与测量 注意&#xff1a;找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明&#xff1a; 扇环半径&#xff1a;圆环ROI的内外圆半径 边缘类型&a…

手把手教学部署前端项目到nginx

1.下载nginx 说明&#xff1a;下载11.20.2版本的nginx。 2.配置nginx 说明&#xff1a;找到conf目录下的nginx.conf文件。 2.1代理静态资源 说明&#xff1a;服务器块监听的端口为8089&#xff0c;意味着Nginx将在8089端口上接收和处理HTTP请求。root后面的值相当于html文…

socket收发数据的处理

1. TCP 协议是一种基于数据流的协议 Socket的Receive方法只是把接收缓冲区的数据提取出来,当系统的接收缓冲区为空,Receive方法会被阻塞,直到里面有数据。 Socket的Send方法只是把数据写入到发送缓冲区里,具体的发送过程由操作系统负责。当操作系统的发送缓冲区满了,Send方法会…

Android中的消息异步处理机制及实现方案

基本介绍 当我们需要执行复杂的计算逻辑&#xff0c;网络请求等耗时操作时&#xff0c;服务器可能不会立即响应请求&#xff0c;如果不将这类操作放在子线程中运行&#xff0c;就会导致主线程被阻塞住&#xff0c;从而影响用户的使用体验如果想要更新应用程序中的UI控件&#…

idea远程调试docker容器内正在运行的线上项目

1.重新编写Dockerfile文件 在原本的Dockerfile上新增参数 就是 运行jar包增加调试参数 增加调试暴漏的端口号 -agentlib:jdwptransportdt_socket,servery,suspendn,address*:50052.在运行docker容器的时候增加暴漏端口5005 3.打开idea就是正在运行的项目 4.选择远程配置 5.配…

解决MyBatis获取刚插入数据的ID值

解决MyBatis获取刚插入数据的ID值 Mybatis获取刚插入数据的ID值有很多解决方法&#xff0c;目前采用以下方式进行获取。 添加完数据后直接返回刚添加数据的id // UserDao.java public static void addUser() throws Exception{InputStream resourceAsStream Resources.getR…

idea的java代码引用proto文件报错

尝试了四种办法&#xff0c;感觉第一个和第二个比较有效。 前提是要先安装了 proto 的idea插件。 1.修改idea配置文件编译大文件的限制 proto生成的源文件有数万行&#xff0c;源文件过大导致 idea 拒绝编译过大的源文件。 解决方案&#xff1a; 如果 protoc 生成的 class 文…

程序优化 --- arthas trace命令使用

最近在做优化,通过arthas的trace命令去观察方法内的耗时情况以便对程序进行修改. 1.启动arthas之后选择需要监测的程序 2.找到需要监测的接口,一般都是直接找service例子如下: trace 类地址.类名 方法名 (中间有空格)

智能计算系统-概述

1、人工智能技术分层 2、人工智能方向人才培养 3、课程体系的建议 4、智能系统课程对学生的价值 5、智能计算系统对老师的价值 6、什么是智能计算系统 7、智能计算系统的形态 8、智能计算系统具有重大价值 9、智能计算系统的三大困难 10、开创深度学习处理器方向 11、寒武纪的国…

MOS开关电路应用于降低静态功耗

本文主要讲述MOS开关电路的应用,过了好久突然想整理一下&#xff0c;有错误的地方请多多指出&#xff0c;在做电池类产品&#xff0c;需要控制产品的静态功耗&#xff0c;即使让芯片进入休眠状态&#xff0c;依旧功率很大&#xff0c;所以在电路中加一组软开关&#xff0c;防止…

嵌入式软件工程师入何突破瓶颈?

各位关注嵌入式软件工程师发展的朋友们&#xff0c;下面来探讨一下嵌入式软件工程师该如何突破瓶颈。首先要强调的是&#xff0c;不要仅仅将自己局限在嵌入式软件工程师这一角色定位上。 事实上&#xff0c;嵌入式软件工程师已经掌握了诸多业务层面的内容&#xff0c;完全有能力…