if、else if 、else及switch...case使用小记(C#)
有时候编程编的久了,如果不停下来认真思考一下,即便是一些最基础的知识点,也可能让自己懵圈。其实,说到底还是打基础的时候没打牢,或者说自以为是地认为自己懂了,然后在打基础的时候就懒得思考懒得看了,结果就是对这个基础知识点的认识一直停留在自己的固有认识里。
好了,下面进入正题。if、else if和else是我们经常要用到的基本语法结构。某日,在园子里看到一博客贴出了这样一个问题。
控制台输入一个成绩,如果 成绩>=90 :输出A,如果90>成绩>=80 输出B,如果80>成绩>=70 输出C ,如果70>成绩>=60 输出D,如果 成绩<60输出E。请思考用if好还是用if-else好还是if else if好,为什么好?
if的代码实现如下:
if (score >= 90)
{
Console.WriteLine("A");
}
if (score >= 80)
{
Console.WriteLine("B");
}
if (score >= 70)
{
Console.WriteLine("C");
}
if (score >= 60)
{
Console.WriteLine("D");
}
if (score < 60)
{
Console.WriteLine("E");
}
if...else的代码实现如下:
if (score >= 90)
{
Console.WriteLine("A");
}
else//<90
{
if (score >= 80)
{
Console.WriteLine("B");
}
else//<80
{
if (score >= 70)
{
Console.WriteLine("C");
}
else//<70
{
if (score >= 60)
{
Console.WriteLine("D");
}
else
{
Console.WriteLine("E");
}
}
}
}
if...else if的代码实现如下:
if (score >= 90)
{
Console.WriteLine("A");
}
else if (score >= 80)
{
Console.WriteLine("B");
}
else if (score >= 70)
{
Console.WriteLine("C");
}
else if (score >= 60)
{
Console.WriteLine("D");
}
在公司做开发时,相信有不少人乱用这几个结构。
我们首先看看if的实现,很明显,各个if语句之间是独立的,无论前面的if语句是否未真,当前if语句均会执行,显然,这种实现效率低下。
再来看第二种和第三种实现,本质上,这两种实现是等价的,在大多数编程语言实现中,else if都不是作为一种基本的关键字出现的,它实际是else语句和if语句的结合,这种组合构造避免了仅使用if、else时的多重嵌套,就像上面的第二种实现,类似于语法糖,便于程序员敲代码。
另外,这种情形也可以使用switch...case结构实现。在C#中,当在整型常量上使用switch结构时,CLR总是会将switch翻译为查找表结构,从而使得每个case分支都能获得相同的执行时间,在这种情形下,相比使用if...else结构同时有一个值或者少量的几个值出现的频率明显较高,那么使用if...else结构且将出现频度较高的值排在前面的执行速度比switch结构会更快。
最后,C#中的switch...case结构还允许使用string常量,这和整型常量稍微不同。它在case标签较少的情况下(大约是6个左右),switch语句将编译成和if语句类似的结构。但是,如果case标签数量足够大(大于6个),那么c#编译器将创建一个HashTable对象,用字符串常量填充它,然后在该表上进行查找,然后跳转。Hashtable查找不是严格意义上的O(1),并且具有显著的常量代价,但是若case标签的数量足够大,它的速度将比在多个if语句中比较字符串常量快。
最新文章
- Java集合——ConcurrentHashMap
- 介绍四款windows下的神器
- 咱就入个门之NHibernate映射文件配置(一)
- struts2.1笔记02:servlet简介
- CPrintDialog 构造函数参数详解
- 数据结构——POJ 1686 Lazy Math Instructor 栈的应用
- Big Event in HDU(杭电1171)(多重背包)和(母函数)两种解法
- easyui datagrid自定义按钮列,即最后面的操作列(转)
- 是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了。
- Linux中查看TCP连接数
- [luogu2051][bzoj1801][AHOI2009]chess中国象棋【动态规划】
- 前端学习历程--js--原型&;闭包
- 【转】使用kettle工具遇到的问题汇总及解决方案
- SpringBoot读取application.properties文件内容
- Spring ApplicationContext(六)BeanPostProcessor
- for-in循环(for-in Loops)
- java后台校验 hibernate validator
- CSS层叠样式
- 多项式求逆元详解+模板 【洛谷P4238】多项式求逆
- logback将日志写入不同文件夹里
热门文章
- delete,truncate,drop的区别
- predict.glm ->; which class does it predict?
- 配置myslq提示 the configuration step starting server is taking longer than expected we apologize for thi
- selenium webdriver ——执行javascript代码
- Java Web 从入门到精通(明日科技)
- Python运维开发基础04-语法基础
- Ssm框架常见报错
- 96. Unique Binary Search Trees (Tree; DP)
- MySQL学习3---事务
- mysql启动参数 skip-grant-tables