C#程序的执行都是一行接一行、自上而下地进行,不遗漏任何代码。为了让程序能按照开发者所设计的流程进行执行,必然需要进行条件判断、循环和跳转等过程,这就需要实现流程控制。C#中的流程控制包含了条件语句、循环语句、跳转语句和异常处理四个方面。
一、跳转语句
break语句:终止并跳出循环体。

continue语句:终止当前循环,重新开始一个新的循环。

goto语句:跳转到指定位置。
C#允许给代码行加上标签,这样就可以使用goto语句直接跳转到这些代码行上。goto语句的用法如下:
goto<labelName>;
标签用下述方式定义:
<labelName>:
goto语句有两个限制,不能跳转到像for循环这样的代码块中,也不能跳出类的范围,不能退出try…catch语句后面的finally块。
这里讲解goto语句只为了解其语法,当遇到时能知道代码的意思,本人不建议使用。

return语句:跳出循环及其包含的函数。

throw语句:抛出一个异常。

二、条件语句
条件语句可以根据条件是否满足或者根据表达式的值控制代码的执行分支。C#有两种控制控制代码分支的结构,分别是if语句和switch语句。
if语句
注意:if语句的条件可以是布尔变量,也可以是表达式,但如果是表达式,则表达式得到的结果必须是布尔值。
1、单选择if语句,即条件成立执行,语法如下:
if(条件)
{
    do;
}

2、ifelse语句,即条件成立执行A否则执行B,语法如下:
if(条件)
{
    do A;
}
else
{
    do B;
}
延伸:三元运算符?:也相当于一个ifelse语句,语法如下:<表达式> ? <resultIfTrue>  : <resultIfFalse>  其中计算表达式可得到一个布尔值,
运算符的结果根据这个值来确定是<resultIfTrue>,还是<resultIfFalse>。例:

            int a = ;
string b = (a < ) ? "小于10" : "大于10";

3、多选择if语句,即对多个条件进行判断,成立的执行,语法如下:
if(条件1)
{
    do A;
}
else if(条件2)
{
    do B;
}
else if(条件3)
{
    do C;
}
else
{
    do D;
}
其中else if语句的个数不受限制,但是如果else if语句的个数较多,则应该考虑另一种分支结构:switch语句。
注意:多选择if语句自上而下,只要有一个条件成立就不会去判断其它任何条件。

switch语句
switch…case语句适合于从一组互斥的分支中选择一个执行分支。其形式是switch参数的后面跟一组case子句。如果switch参数中表达式的值等于某个case子句旁边的某个值,就执行该case子句中的代码。此时不需要使用花括号把语句组合到块中,只需使用break语句标记每段case代码的结尾即可。也可以在switch语句中包含一条default子句,如果表达式不等于任何case子句的值,就执行default子句的代码。其语法如下:
switch(表达式)
{
    case 1:
    Console.WriteLine("1");
    break;
    case 2:
    Console.WriteLine("2");
    break;
    case 3:
    Console.WriteLine("3");
    break;
    default:
    Console.WriteLine("4");
    break;  
}
注意:switch语句每个case语句后面的值必须与表达式所得到的值的类型相同,而且必须是常量,不能是变量;switch语句中所有case语句后面的值必须是互斥的,也就是说case后面的值不能存在两个相同的值,因为所有case语句后面的值必须是互斥的,所以case语句的排放顺序无关紧要,甚至可以把default语句放在最前面!但是为养成良好的编程习惯和代码有清晰的逻辑,我不建议这样写;switch语句中default语句只能存在一个,不能存在多个;通常情况下,每个case后面都必须有一个break语句,break语句作用是中断switch语句的执行,但C#中也可以使用其它中断语句来中断switch语句的执,如return语句、goto语句。使用break语句和return语句来中断是有区别的,break语句仅仅中断switch语句的执行,如果switch语句后面还有其它代码是可以继续执行的,但是return语句中断则会中断switch语句所在的方法,也就是说switch语句后面的代码将不会执行,switch语句所在的方法将直接返回。使用goto语句可以从一个case跳到另一个case中执行,如下面这段代码:

            int a = ;
switch (a)
{
case :
Console.WriteLine("");
goto case ;
case :
Console.WriteLine("");
break;
case :
Console.WriteLine("");
break;
default:
Console.WriteLine("");
break; }

程序说明:程序执行完 case 1后会直接执行case 2。但是我们不建议这样做,这会导致很难察觉的逻辑错误。

通常情况下switch语句中一个case语句处理完成后,不能自由的进入下一个case语句,但是这个规则有一个例外。如果把多个case语句放在一起,其后面加一个代码块,实际上是一次检查多个条件,如果满足这些条件中的任何一个,就会执行代码,例如:

            int a = ;
switch (a)
{
case :
case :
case :
Console.WriteLine("1或者2或者3");
break;
default:
Console.WriteLine("");
break; }

三、循环语句
循环就是重复执行语句,循环结构可以实现一个程序模块的重复执行,它对我们简化程序、更好的组织算法有着重要的意义。
1、do循环
do循环的结构如下:
do
{
    语句或语句块;
}while (表达式);
do循环先执行语句或语句块,然后再判断表达式的值,如果表达式的值为true,则继续执行循环,直到表达式的值为false。注意:do循环刚执行的时候不管表达式的值为true或者是false它都要先执行一次语句或语句块,然后再来判断表达式的值。也就是说如果一开始表达式的值为false,它也会执行一次循环。do循环无论布尔表达式的值是true还是false,语句或语句块至少会执行一次。另外while语句后面必须使用分号(;)。

2、while循环
while循环的结构如下:
while(表达式)
{
    语句或语句块;
}
while循环则是先判断表达式的值,然后再执行语句或语句块,直到表达式的值为false。如果循环刚开始表达式的值就为false,那么语句或语句块就不会被执行。

3、for循环
for循环的结构如下:
for(<初始化表达式>;<条件表达式>;<迭代表达式>)
{
    语句或语句块;
}
初始化表达式:可以在该位置定义一个变量并为其赋一个起始值,也可以使用for循环前面定义的变量,但是使用for循环前面定义的变量必须在该位置为其重新赋一个起始值。注意:在该位置定义一个变量并为其赋一个起始值,这种用法定义的变量的作用域仅在for循环语句中,也就是说for循环语句后面的代码就不能使用该变量;但是用for循环前面定义的变量这种用法定义的变量for循环语句后面的代码就也能使用该变量。
条件表达式:它是循环继续或者终止的条件。
迭代表达式:执行完语句或语句块后就执行迭代表达式,然后再执行条件表达式判断循环是否继续。
for循环示例:

            //将1到10打印到屏幕上
for (int a = ; a <= ; a++)
{
Console.WriteLine(a);
}
Console.ReadKey();

4、foreach循环
foreach语句用于枚举一个集合的元素,并对该集合中的每一个元素执行一次嵌入语句。foreach循环的结构如下:
foreach(<类型> <迭代变量名> in <集合>)
{
    语句或语句块;
}
注意:迭代变量的类型必须与集合的类型相同。集合内元素的个数决定循环内程序段重复执行的次数,每次进入循环,会依次将集合元素内容指定给变量,当所有元素都读完后,就会跳出foreach循环。foreach循环对集合内元素进行只读访问,不能改变任何元素的值。foreach循环在循环的过程中不能对集合进行添加元素或者删除元素的操作。示例:

            List<string> strList = new List<string>();
for (int a = ; a <= ; a++)
{
strList.Add(a.ToString());
} foreach (string str in strList)
{
Console.WriteLine(str);
strList.Remove(str);
}
Console.ReadKey();

以上程序中的foreach语句在输出集合strList中的第一元素并将其移除集合后进行下一次循环的时候会产生异常。

5、无限循环
在代码编写错误或者故意进行设计时,可以定义永不终止的循环,即所谓的无限循环。示例:
while(true)
{
    语句或语句块;
}
无限循环语句也是有用的,而且可以使用break语句或者手工使用Windows任务管理器退出无限循环。

四、异常处理
C#中的异常处理也算一种流程控制,try…catch…finally语句用于异常的捕获和处理,具体语法如下:
try
{
    语句或语句块;
}
catch(<execptionType> e)
{
    语句或语句块;
}
finally
{
    语句或语句块;
}
try:包含抛出异常的代码。
catch:包含抛出异常时要执行的代码。catch块可以使用<execptionType>设置为只响应特定的异常类型,以便提供多个catch块。
finally:包含始终会执行的代码,如果没有产生异常,则在try块之后执行,如果处理了异常,就在catch块后执行。
try…catch…finally语句的执行顺序依次是:
1、try块在发生异常的地方中断程序的执行。
2、如果有catch块,就检查该块是否匹配已抛出的异常类型。如果没有catch块,就执行finally块(如果没有catch块,就一定要有finally块)。
3、如果有catch块,但它与已发生的异常类型不匹配,就检查是否有其他catch块。
4、如果有catch块匹配已发生的异常类型,就执行它包含的代码,再执行finally块(如果有)。
5、如果catch块都不匹配已发生的异常类型,就执行finally块(如果有)。
从try…catch…finally语句的执行顺序可以看出try…catch…finally语句有多种组合模式,这里就不详细讲解。

C#基础之流程控制语句详解的更多相关文章

  1. Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  2. Python基础教程,流程控制语句详解

    1.程序结构 计算机在解决问题时,分别是顺序执行所有语句.选择执行部分语句.循环执行部分语句,分别是:顺序结构.选择结构.循环结构.如下图: 很多人学习python,不知道从何学起.很多人学习pyth ...

  3. Windbg命令脚本流程控制语句详解

    在Windbg命令脚本一文里,我们介绍了命令脚本语言的的组成要素,在本文里将对语句进行展开的讲解.这些语句主要是流程控制的语句,比如我们常见的条件分子和循环语句等. ; (命令分隔符) 分号(:)字符 ...

  4. Python流程控制语句详解

    1.程序结构 计算机在解决问题时,分别是顺序执行所有语句.选择执行部分语句.循环执行部分语句,分别是:顺序结构.选择结构.循环结构.如下图: 2.选择语句 2.1最简单的if语句 Python使用保留 ...

  5. (转)CentOS系统启动流程图文详解

    CentOS系统启动流程图文详解. 原文:http://www.linuxidc.com/Linux/2017-03/141966.htm 熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽 ...

  6. Qt零基础教程(四) QWidget详解篇

    在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...

  7. Qt零基础教程(四)QWidget详解(3):QWidget的几何结构

    Qt零基础教程(四)  QWidget详解(3):QWidget的几何结构 这篇文章里面分析了QWidget中常用的几种几何结构 下图是Qt提供的分析QWidget几何结构的一幅图,在帮助的 Wind ...

  8. mysql基础篇 - SELECT 语句详解

    基础篇 - SELECT 语句详解         SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...

  9. [五]基础数据类型之Short详解

      Short 基本数据类型short  的包装类 Short 类型的对象包含一个 short 类型的字段      原文地址:[五]基础数据类型之Short详解   属性简介   值为  215-1 ...

随机推荐

  1. python之解析json

    json的格式是一个无序的键值对的集合,对象以{}包含,键值中间用:隔开,两个键值对之间用,隔开,值可以是双引号引起来的字符串(string),数值(number),true,false,null,对 ...

  2. Python新利器之pipenv(转)

    pipenv 都包含什么? pipenv 是 Pipfile 主要倡导者.requests 作者 Kenneth Reitz 写的一个命令行工具,主要包含了Pipfile.pip.click.requ ...

  3. 实现JNI的另一种方法:使用RegisterNatives方法传递和使用Java自定义类 (转)

    原帖地址:http://blog.csdn.net/qiuxiaolong007/article/details/7860610 除了使用传统方法实现JNI外,也可以使用RegisterNatives ...

  4. 归纳整理Linux下C语言常用的库函数----文件操作

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  5. Go structs、slices、maps

    [Go structs.slices.maps] 1.定义时*在变量名后面,使用时*在变量名前面. 2.定义struct,type在前,struct关键字在后. 3.指针可以指定struct. 4.A ...

  6. golang之panic,recover,defer

    defer,recover: 运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃. recover内建函数用于“拦截”运行时恐慌,可以使当前的程序从恐慌状态中恢复并重新获得流程控制权. recover ...

  7. Sketch插件新利器——使用Mockplus DS制作设计规范

    Sketch,作为一款专为图标和界面设计而打造的优质矢量绘图工具,也是设计师们制作和完善公司企业内部设计规范系统不可或缺的设计工具. 然而,逐个导出和上传Sketch编辑优化的设计系统资源费时而费力. ...

  8. o7 文件和函数

    一:文件 1 控制文件内指针的移动 文件内指针移动,只有在t模式下的read(n),n代表的字符的个数 除此之外文件内指针的移动都是以字节为单位的 with open('a.txt',mode ='r ...

  9. Bitmap Images and Image Masks

    [Bitmap Images and Image Masks] Bitmap images and image masks are like any drawing primitive in Quar ...

  10. 高性能mysql第三版(文摘)

    第1章 mysql架构与历史 1.1处理和存储相分离,用户可以选择合适的存储引擎 1.2并发控制 表锁:开销小 行级锁:开销大 1.3事务 acid特性:原子性,一致性,隔离性,持久性 1.4 多版本 ...