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则不会,那怕条件重复也不会提示.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux快速修改ip地址

Linux修改IP配置 一 、查找ip配置文件 ifcfg-ens33二、编辑 vi ifcfg-ens33文件三、重启网络或者重启系统 一 、查找ip配置文件 ifcfg-ens33 cd /etc/sysconfig/network-scripts/ls //查看network-scripts文件夹下面的文件二、编辑 vi ifcfg-ens33文件 vi ifcfg-ens33注意&…

反序列化 [NPUCTF2020]ReadlezPHP1

打开题目 直接查看源代码 打开源代码发现了个./time.php?source 访问一下 审计代码&#xff1a; 现存在反序列化语句&#xff1a;$ppp unserialize($_GET["data"]);和执行漏洞&#xff1a;echo $b($a); 发现在__destruct()方法里面有 echo $b($a); 这个是php的…

用6点结构标定5点结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有6个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;A的6张图片共有5个点&#xff0c;B全是0.收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 如果使行和列自由变换&#xff0…

Sora是什么?

文章目录 前言Sora是什么&#xff1f;功能特色优点 缺点Sora模型的工作原理如何使用Sora模型Sora模型的应用场景Sora模型带来的问题虚假信息版权问题 后记 前言 Sora是美国人工智能研究公司OpenAI发布的一款令人惊叹的人工智能文生成视频大模型。近年来&#xff0c;人工智能技…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义&#xff1a;分布式环境下的事务处理机制 CAP定理&#xff1a;在一个分布式系统中&#xff0c;涉及共享数据问题时&#xff0c;以下三个特性最多只能同时满足两个 一致性&#xff1a;代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…

SpringBoot-2.7.6基于SLF4J日志门面的日志框架切换

SpringBoot 没有强制性的日志记录依赖项,但 Commons Logging API 除外,它通常由 Spring Framework 的模块提供。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是您只需要通过启动器,这都取决于 . 对于 Web 应用程序 ,因为它可传递地依赖于日志记录启动器。 如果…

持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍

引言&#xff1a;上一期我们部署好了gitlab极狐网页版&#xff0c;今天我们介绍一下GitLabCI / CD 目录 一、为什么要 CI / CD 方法 1、持续集成 2、持续交付 3、持续部署 二、GitLab CI / CD简介 三、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 …

ELK入门(三)-Kibana

Kibana Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等&#xff0c;直观的展示数据&#xff0c;从而达到高级…

让C语言代码变抽象(二)

目录 前言&#xff1a; 代码&#xff1a; 前言&#xff1a; 在今天写代码的时候&#xff0c;我又想到一个更抽象的代码。 我在写注释的时候突然想想到条件编译的东西&#xff0c;好像也能用来注释东西。 代码&#xff1a; 我们在这直接上干货 我们知道在条件编译中有一个叫…

鸿蒙开发-DevEcoStudio的安装及使用

DevEcoStudio的安装及使用 前言 DevEcoStudio分为两个版本&#xff0c;分别用于HarmonyOS和OpenHarmony开发&#xff0c;截止文档编写时&#xff0c;用于开发HarmonyOS的DevEcoStudio版本为3.1.1&#xff0c;适用于OpenHarmony的DevEcoStudio版本为4.0.0。 接下来的文档是基…

React18源码: schedule任务调度messageChannel

React调度原理(scheduler) 在React运行时中&#xff0c;调度中心&#xff08;位于scheduler包&#xff09;是整个React运行时的中枢&#xff08;其实是心脏&#xff09;&#xff0c;所以理解了scheduler调度&#xff0c;就基本掌握了React的核心React两大循环&#xff1a;从宏…

年关将至送大礼 社区适时献爱心

在这个快节奏的时代&#xff0c;社区作为人们生活的重要组成部分&#xff0c;其凝聚力和互助精神显得尤为重要。2024年2月7日&#xff0c;实践队员李若钰有幸参与了社区礼盒分装的活动&#xff0c;这不仅仅是一次简单的劳动&#xff0c;更是一次心灵的洗礼和感悟。 礼盒分装&am…

HTML5和CSS3提高

一、HTML5的新特性 增加了一些新的标签&#xff0c;新的表单&#xff0c;新的表单属性&#xff0c;IE9以上版本的浏览器才支持 注意&#xff1a; 这些语义化标准主要针对搜索引擎的 新标签可以使用多次 在IE9中需要把这些元素转化为块级元素 新增的多媒体标签 主要包含两个…

Java JDBC:林浩然与杨凌芸的编程奇缘

Java JDBC&#xff1a;林浩然与杨凌芸的编程奇缘 Java JDBC: The Programming Odyssey of Lin Haoran and Yang Lingyun 在那个充满二进制和算法符号的世界里&#xff0c;我们的男主角林浩然&#xff0c;一个热爱Java的码农新秀&#xff0c;正准备踏上他的JDBC探险之旅。他那双…

【vscode】按F5无法执行调试python或go

原因&#xff1a; 找不到解析器&#xff0c;需要安装插件&#xff08;python&#xff0c;或go 等&#xff09; 安装插件后&#xff0c;还是无法执行&#xff0c;按 ctrlshiftp,看不到解析器 正常应该是&#xff1a; 解决方法&#xff1a; 1、判断python是否安装成功 pyth…

Selenium(简单入门)

请直接看原文:selenium 使用教程详解-java版本 - 小葛师兄 - 博客园 (cnblogs.com) -------------------------------------------------------------------------------------------------------------------------------- 第一章 Selenium 概述# 1.1.Selenium 发展史# ​ …

“从根到叶:深入理解排序数据结构“

一.排序的概念及引用 1.1排序的概念 排序是指将一组数据按照一定的规则重新排列的过程。排序的目的是为了使数据具有有序性&#xff0c;便于查找、插入、删除等操作&#xff0c;提高数据的组织和管理效率。 稳定性是指如果序列中存在相等元素&#xff0c;在排序完成后&#…

五、矩阵的运算

1、矩阵的加减&#xff1a; 前提&#xff1a;两个矩阵必须是同形矩阵。 矩阵加减具有交换律&#xff0c;矩阵矩阵相乘没有交换律。 计算结果&#xff1a;元素级运算。 2、矩阵的数乘&#xff1a; 计算结果&#xff1a;元素级运算。这里要区别与行列式的数乘。 3、矩阵与向量的乘…

fiddler抓取,Android真机测试

1.配置Fiddler抓取并解密HTTPS包 Fiddler默认是不抓取HTTPS包的&#xff0c;需要进行相应的配置。 打开Fiddler&#xff0c;选择“Tools->Fiddler Options...” 2.在弹出的对话框中选择“HTTPS”选项卡&#xff1a; 3.勾选“Capture HTTPS CONNECTs”&#xff0c;接着勾选…