C# If与Switch的区别

news2024/9/22 15:31:32

在 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.coloradmin.cn/o/1468261.html

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

相关文章

AI:136-基于深度学习的图像生成与风格迁移

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

提升装备制造企业竞争力:2023年CRM选型与应用完全解读

在加快产业转型升级的大背景下&#xff0c;高端装备制造业既面临机遇也面临挑战。随着公司规模的不断壮大&#xff0c;再加上装备制造业营销体系及服务体系管理体系的复杂性&#xff0c;一些问题逐渐暴露出来&#xff0c;装备制造业企业需要根据自身业务需求和管理流程选择合适…

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…

k8s-helm部署应用 19

Helm部署nfs-client-provisioner&#xff08;存储类&#xff09;&#xff1a; 预先配置好外部的NFS服务器 部署 Helm部署nginx-ingress应用&#xff1a; 添加下载ingress 拉取 解开并修改 部署 测试 回收 helm部署metrics-server&#xff1a; 清除之前的metrics部署 下载…

QT问题 打开Qt Creator发现没有菜单栏

之前不知道按了什么快捷键,当我再次打开Qt Creator时发现菜单栏消失啦 找了许多原因发现:安装有道词典的快捷键Ctrl Alt m 与Qt Creator里的快捷键冲突导致菜单栏被莫名其妙的隐藏 解决方法: 1找到有道词典快捷键 2再次按快捷键 Ctrl Alt m就可以重新显示菜单栏

Linux系统——nginx服务补充

目录 一、Nginx调优补充 1.验证模块——登录 1.1htpasswd 1.1.1htpasswd -c——交互式 1.1.2htpasswd -b——免交互式 2.自定义错误页面 2.1设置错误页面——想让客户端看到的页面 2.2自定义错误码 3.日志位置存放&#xff08;可以自定义存放位置&#xff09; 4.检测…

零基础手把手教你创建微信小程序(二)·创建第一个微信小程序以及了解小程序代码的构成

零基础手把手教你创建微信小程序&#xff08;一&#xff09;微信小程序开发账号的注册以及开发者工具的安装和使用-CSDN博客 目录 ​编辑 1. 创建微信小程序 1.1 基本信息 1.2 在模拟器上查看项目效果 1.3 在真机上预览项目效果 1.4 主界面的5个组成部分 1.4.1 菜单…

华为HCIP Datacom H12-831 卷23

单选题 1、某园区部署IS-IS实现网络互通&#xff0c;在所有IS-IS路由器的进程中配置命令flash-flood 6 max-timer-interval 100 Leve1-2&#xff0c;则以下关于该场景的描述,正确的是哪—项? A、若某IS-IS路由器LSDB内更新的LSP数量为5,则在100毫秒内且路由计算完成前&#…

对象怎样才会进入老年代?

JVM 对象内存分配&#xff1a;空间担保机制案例演示&#xff1a;对象分配过程01-大对象直接进入老年代02-对象内存分配的过程&#xff1a;案例演示&#xff1a;内存担保机制 对象内存分配&#xff1a; 新生代&#xff1a;新对象大多数都默认进入新生代的Eden区进入老年代的条件…

盲盒小程序开发:线上盲盒带来的发展

盲盒在我国的发展一直处于稳步上升阶段&#xff0c;盲盒的未知性和刺激性为消费者带来了全新的娱乐消费模式。并且盲盒具有的收藏价值也吸引着消费者进行复购&#xff0c;使消费者欲罢不能。在盲盒的不断创新发展&#xff0c;形成了一套可持续发展的商业模式&#xff0c;具有较…

企业微信怎么变更企业名称?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…

并发编程(4)共享模型之无锁

6 共享模型之无锁 本章内容 CAS 与 volatile原子整数原子引用原子累加器Unsafe 6.1 问题提出 有如下需求&#xff0c;保证 account.withdraw 取款方法的线程安全 import java.util.ArrayList; import java.util.List;interface Account {// 获取余额Integer getBalance();…

spring框架介绍

spring 1.优点 1&#xff09;针对接口编程&#xff0c;解耦合 2&#xff09;aop&#xff1a;变向切面编程&#xff0c;动态增加功能 3&#xff09;方便集成框架&#xff0c;mybatis,hibernate,strust等 4&#xff09;降低j2ee接口的使用难度 2.spring是干什么的 管理bean及bean…

私域运营-需要认清的事实

一、私域不能单纯依靠微信渠道 误区&#xff1a;很多企业仍停留在如何让用户在微信去分享裂变&#xff0c;然后带动新用户的阶段。 私域的核心在于“开源节流”&#xff0c;就是如何通过更多渠道获取更多客户&#xff0c;并且避免客户的批量流失。 私域讲究的是如何从公域的“…

【IDEA】安装Jrebel实现热部署

前言 devtool虽然也可以实现热部署 但是新增完方法和修改完参数后 热部署不生效 需要重启 而Jrebel却不用 功能也比devtool强大 但是收费 这里教大家怎么使用 插件下载 激活Jrebel

Qiskit模块介绍

中文版reference Terra Qiskit最基本的模块&#xff0c;相当于Qiskit包的前端&#xff0c;包含了Quantum Circuits、Transpiler等,包括了定义、编译量子电路&#xff0c;以及在模拟器或是量子设 备上运行电路的工具。 Aer 相当于Qiskit包的后端&#xff0c;高性能模拟器&…

DC与DCT DCG的区别

先进工艺不再wire load model进行静态时序分析&#xff0c;否则综合结果与后端物理电路差距很大&#xff0c;因此DC综合工具也进行了多次迭代&#xff0c;DC工具有两种模式&#xff0c;包括wire load mode和Topographical Mode&#xff0c;也就是对应的DC Expert和DC Ultra。 …

牛客网 HJ10 字符个数统计

思路&#xff1a; 我们创建两个数组&#xff0c;一个数组接受输入的字符&#xff0c;另一个数组用来统计字符种数 同时将该字符作为下标传给另一个数组&#xff0c;如果另一个数组的这个下标对应的值为0&#xff0c;说明该字符没有被统计过&#xff0c;计数器加1&#xff0c;…

vue+node.js美食分享推荐管理系统 io551

&#xff0c;本系统采用了 MySQL数据库的架构&#xff0c;在开始这项工作前&#xff0c;首先要设计好要用到的数据库表。该系统的使用者有二类&#xff1a;管理员和用户&#xff0c;主要功能包括个人信息修改&#xff0c;用户、美食类型、美食信息、订单信息、美食分享、课程大…

洛谷P8627 [蓝桥杯 2015 省 A] 饮料换购

#先看题目 题目描述 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料&#xff0c;凭 3 个瓶盖可以再换一瓶 C 型饮料&#xff0c;并且可以一直循环下去(但不允许暂借或赊账)。 请你计算一下&#xff0c;如果小明不浪费瓶盖&#xff0c;尽量地参加活动&#xff0c;那…