C# If与Switch的区别

在 switch 语句中使用表达式比较时,编译器会生成一个查找表,其中包含所有表达式的值和对应的 case 标签。因此,与使用常量或字面量比较相比,使用表达式比较可能会略微降低性能。

只有当 switch 语句中的所有 case 标签都使用常量或字面量时,编译器才会生成查找表。如果 switch 语句中包含任何表达式,编译器将使用不同的机制来评估这些表达式,这与 if 语句类似。

因为 switch 语句在编译时可以优化为查找表,而 if 语句则需要在运行时逐个评估每个条件。查找表可以提供更快的查找速度,尤其是在 case 标签较多时。所以,在相同的机器、系统和比较条件下,switch 语句的性能通常大于或等于 if 语句

下面简单测试一下:

选择相同的6个分支,在循环中来判断。

            Stopwatch sw = new Stopwatch();int iterations = 300000000;int value = 3;for (int j = 0; j < 6; j++){Console.WriteLine($"第{j + 1}次比较-----------");//使用 if 语句进行测试sw.Start();for (int i = 0; i < iterations; i++){if (value == 1) { }else if (value == 2) { }else if (value == 3) { }else if (value == 4) { }else if (value == 5) { }else if (value == 6) { }}sw.Stop();Console.WriteLine("If 语句运行时间:{0} 毫秒", sw.ElapsedMilliseconds);//使用 switch 语句进行测试sw.Restart();for (int i = 0; i < iterations; i++){switch (value){case 1: break;case 2: break;case 3: break;case 4: break;case 5: break;case 6: break;}}sw.Stop();Console.WriteLine("Switch 语句运行时间:{0} 毫秒", sw.ElapsedMilliseconds);}

结果:

结论:字面量或常量时,switch会优于if.

修改上面全面改为表达式:

            Stopwatch sw = new Stopwatch();int iterations = 300000000;int value = 3;for (int j = 0; j < 6; j++){Console.WriteLine($"第{j + 1}次比较-----------");//使用 if 语句进行测试sw.Start();for (int i = 0; i < iterations; i++){if (value < 1) { }else if (value < 2) { }else if (value < 3) { }else if (value < 4) { }else if (value < 5) { }else if (value < 6) { }}sw.Stop();Console.WriteLine("If 语句运行时间:{0} 毫秒", sw.ElapsedMilliseconds);//使用 switch 语句进行测试sw.Restart();for (int i = 0; i < iterations; i++){switch (value){case < 1: break;case < 2: break;case < 3: break;case < 4: break;case < 5: break;case < 6: break;}}sw.Stop();Console.WriteLine("Switch 语句运行时间:{0} 毫秒", sw.ElapsedMilliseconds);}

结果:

结论:看来简单的常量表达式也会有优化,效率也会提升。

缺点:switch不能用于其它复杂的表达式,switch 语句中的 case 标签必须是常量表达式。不能包含变量或其他会改变其值的内容。

但大多数情况下,都要用到复杂的表达式和变量表达式,所以一般用IF而不能用Switch。

switch因为里面会根据case生成查找表,所以一般查找表各case是唯一的,在输入时就会检查,如果case条件重复或矛盾,就会有红色提示。但if则不会,那怕条件重复也不会提示.

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

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

相关文章

Web 前端 UI 框架Bootstrap简介与基本使用

Bootstrap 是一个流行的前端 UI 框架&#xff0c;用于快速开发响应式和移动设备优先的网页。它由 Twitter 的设计师和工程师开发&#xff0c;现在由一群志愿者维护。Bootstrap 提供了一套丰富的 HTML、CSS 和 JavaScript 组件&#xff0c;可以帮助开发者轻松地构建和定制网页和…

【Qt学习】QRadioButton 的介绍与使用(性别选择、模拟点餐)

文章目录 介绍实例使用实例1&#xff08;性别选择 - 单选 隐藏&#xff09;实例2&#xff08;模拟点餐&#xff0c;多组单选&#xff09; 相关资源文件 介绍 这里简单对QRadioButton类 进行介绍&#xff1a; QRadioButton 继承自 QAbstractButton &#xff0c;用于创建单选按…

HTTP攻击,该怎么防护

一般网络世界里为人们所熟知的DDoS攻击&#xff0c;多数是通过对带宽或网络计算资源的持续、大量消耗&#xff0c;最终导致目标网络与业务的瘫痪&#xff1b;这类DDOS攻击&#xff0c;工作在OSI模型的网络层与传输层&#xff0c;利用协议特点构造恶意的请求载荷来达成目标资源耗…

2024年【起重机司机(限桥式起重机)】考试报名及起重机司机(限桥式起重机)证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限桥式起重机)考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机司机(限桥式起重机)证考试题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机司机(限桥式起重机)作业考试题库…

修复Microsoft Edge WebView2无法安装的问题

修复Microsoft Edge WebView2无法安装的问题 场景解决方案 场景 系统&#xff1a;win11 电脑&#xff1a;联想14 前提&#xff1a;使用Geek Uninstaller强制删除了Microsoft Edge WebView2 同时下载了clash verge。 发现根本无法运行&#xff08;点击了无任何反应且图标颜色…

【深度学习笔记】3_6 代码实现softmax-regression

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.6 softmax回归的从零开始实现 这一节我们来动手实现softmax回归。首先导入本节实现所需的包或模块。 import torch import torchvision import numpy as np import…

QT Widget自定义菜单

此文以设置QListWidget的自定义菜单为例&#xff0c;其他继承于QWidget的类也都可以按类似的方法去实现。 1、ui文件设置contextMenuPolicy属性为CustomContextMenu 2、添加槽函数 /*** brief onCustomContextMenuRequested 右键弹出菜单* param pos 右键的坐标*/void onCusto…

十一、Qt数据库操作

一、Sql介绍 Qt Sql模块包含多个类&#xff0c;实现数据库的连接&#xff0c;Sql语句的执行&#xff0c;数据获取与界面显示&#xff0c;数据与界面直接使用Model/View结构。1、使用Sql模块 &#xff08;1&#xff09;工程加入 QT sql&#xff08;2&#xff09;添加头文件 …

2023年的AI模型学习/部署/优化

可以的话&#xff0c;github上给点一个小心心&#xff0c;感谢观看。 LDC边缘检测的轻量级密集卷积神经网络&#xff1a; meiqisheng/LDC (github.com)https://github.com/meiqisheng/LDC segment-anything分割一切的图像分割算法模型&#xff1a; meiqisheng/segment-anyt…

群晖NAS DSM7.2.1安装宝塔之后无法登陆账号密码问题解决

宝塔的安装就不在这赘述了&#xff0c;只说下&#xff0c;启动之后默认账号密码无法登陆的问题。 按照上面给出的账号密码&#xff0c;无法登陆 然后点忘记密码&#xff0c;由于是docker安装的&#xff0c;根目录下没有/www/server/panel 。 也没有bt命令 要怎么修改呢。 既然…

【Java程序设计】【C00283】基于Springboot的校园志愿者管理系统(有论文)

基于Springboot的校园志愿者管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园志愿者管理系统 本系统分为系统功能模块、管理员功能模块以及志愿者功能模块。 系统功能模块&#xff1a;用户进入到系统…

应用中如何将单数据库升级为集群【数据库集群】【MySQL集群模式】

MySQL集群架构搭建以及多数据源管理实战 应用中如何将单数据库升级为集群1、搭建MySQL集群&#xff0c;实现服务和数据的高可用1>搭建基础MySQL服务。​ 2、启动MySQL服务​ 3、连接MySQL 2>搭建MySQL主从集群1》配置master服务2》配置slave从服务3》主从集群测试4》全库…

Github 2024-02-23 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目4Python项目3TypeScript项目1HTML项目1Dart项目1Rust项目1 从零开始构建你喜爱的技术 创建周…

智胜未来,新时代IT技术人风口攻略-第七版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像角色先行结论 - 市场下的增量蛋糕高校助力鸿蒙 - 掀起鸿蒙教育热潮高校鸿蒙课程开设占比 - 巨大需求背后是矛盾冲突教研力量并非唯一原因 - 看重教学成果复用与效率 企业布局规划 - 多元市场前瞻视野全盘接纳仍需一段时间 - 积极正向的一…

【新手易错点】golang中byte和rune

1 总体区别 在Golang中&#xff0c;byte和rune是两种不同类型的数据。简单来说&#xff0c;byte是一个8位的无符号整数类型&#xff0c;而rune则是一个32位的Unicode字符类型。 Byte: 在Golang中&#xff0c;byte类型实际上是uint8的别名&#xff0c;它用来表示8位的无符号整…

2.22日学习打卡----正则表达式

2.22日学习打卡 目录&#xff1a; 2.22日学习打卡正则表达式什么是正则表达式&#xff1f;正则表达式的作用正则表达式特点基础语法表格元字符Java 中正则表达式的使用正则表达式语法规则内容限定单个字符限定范围字符限定取反限定 长度限定长度限定符号预定义字符正则表达式的…

【MySQL】MySQL从0到0.9 - 持续更新ing

MySQL SQL 基础 DDL 语句 show databases; show tables; desc table_name; # 获取表信息 show create table 表名; // 查询指定表的建表语句 数据类型 char(10) 不满10个会用空格填充&#xff0c;性能好一点 varchar(10) 变长字符串&#xff0c;性能差一点 CREATE TABLE tabl…

力扣 187. 重复的DNA序列

1.题目 DNA序列 由一系列核苷酸组成&#xff0c;缩写为 A, C, G 和 T.。 例如&#xff0c;"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不止一…

【word技巧】word文档如何设置限制编辑

Word文档中为了提高办公效率以及文档安全&#xff0c;我们可以考虑为word文档设置一个限制编辑起到保护文档的作用。今天介绍word文档设置限制编辑的方法。 打开word文档之后&#xff0c;点击功能栏中的【审阅】功能&#xff0c;选择【限制编辑】功能 这是我们勾选右边弹框中的…

【Spring MVC篇】简单案例分析

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、加法计算器二…