C#学习笔记之程序流程和异常处理

1. 条件语句

  • if_else语句同C语言
  • switch语句:
    switch 结构:
switch (condition)
{
    case 常量表达式1:
        condition == 常量表达式1 时执行的语句;
        break;
    case 常量表达式2:
        condition == 常量表达式2 时执行的语句;
        break;
    default:
        不满足上述条件时执行的语句;
        break;
}

case 个数 >= 0。
任何两个 case 语句的常量表达式都不能具有相同的值,注意是值不能相同。
case 和 default 的 break 必不可少,这不同于 C++。
default 可以省略,但为了可读性以及可维护性,建议写上,即使它什么也不做。
condition 允许的数据类型为:sbyte、byte、short、ushort、uint、long、ulong、char、string 或者枚举类型。
注意:
1、如果一个case语句为空,就可以从这个case跳到下一个case上,这样就可以用相同的方式处理两个或多个case语句了
2、case语句的排放顺序是无关紧要的,甚至可以把default放在最前面
3、在C#中,可以把字符串用作测试变量

  • 条件运算符:
    ?: 条件实际应该称作条件运算符,属于运算符一类,由于它具有判断特性,所以这里和条件语句归为一类讲解,其语法是:
condition ? first_expression : second_expression;

它的意思是当 condition 为 true 时,返回 first_expression,否则返回 second_expression。

2. 循环语句

  • for语句
  • while语句与do…while语句
    以上三种语句用法同C
  • foreach语句:
    格式如下:
foreach (var item in collection)
     {

     }

in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

foreach函数简单理解就是一个循坏语句,从开始到结尾.把这个集合的数都赋值一个标识符.
然后用这个标识符运用这是集合的属性.

举个例子:
实例化一个图书馆里面的所有书的泛型集合
List list = new List();
foreach(Book item in list)
{
//这里就是将list中的Book元素取出来赋给item
   //item相当于一本书,list是所有书的集合
   //然后在下面就可以通过item来使用Book的属性了,假定图书名称为bookName,列:
   item.bookName = “C#语言编程”;
}

3. 跳转语句

  • goto语句
    goto语句将程序控制直接转到由标签标记的语句。goto语句形式如下:
goto identifier;
goto case 常量表达式;
goto default;

说明:
① goto identifier;语句跳转到由 identifier 标签标记的语句。 identifier 是一个标识符(标号),标号由字母、数字和下划线构成,且首字母必须是字母或下划线。任何转移到的标号后面应带一个冒号。
② goto语句的后两种形式用于将控制传递给特定的 switch…case 标签或switch 语句中的默认标签。
③ goto语句可用于跳出深嵌套循环,即如果一次要跳出两层或更多层的循环,应使用goto语句,而不能直接使用break语句,因为break语句只能跳出一层循环。
④ goto语句不能直接跳转进入循环体。
⑤ 结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将使程序结构不清晰,可读性差。

  • break语句
    break语句用于跳出switch结构以及for、foreach、while或do…while循环。
    注意:break语句不能用于循环语句和switch语句之外的任何其他语句中,否则将产生编译时错误。

  • continue语句
    continue语句同break语句使用环境相同,但是它结束本次循环之后,即跳过循环体自continue下面尚未执行的语句,返回到循环的起始处,并根据循环条件判断是否执行下一次循环。
    与break语句类似,continue语句只能跳出一层循环。

  • return语句
    return语句终止其所在方法的执行并将控制返回给调用方法。如果方法有返回类型,return语句必须返回这个类型的值。

4. 错误和异常处理

  • 错误与异常
    C#程序会产生各种各样的错误。大致可以分为以下几种类型:
    ① 编译错误,即各种语法错误。对于编译错误,C#编译器会直接抛出异常,根据输出的异常信息,可修改程序代码。
    ② 运行时错误。如打开不存在的文件、零除溢出等。对于运行时错误,CLR会抛出异常,代码中可以通过try…catch语句捕获并处理。如果程序中没有try…catch,则C#解释器直接输出异常信息。
    ③ 逻辑错误。程序本身不报错,但结果不正确。对于逻辑错误,需要根据结果来调试判断。

  • 异常处理概述
    当程序运行产生错误时,必须进行相应的处理。传统的编译语言,一般通过函数的返回值进行判断处理(如0表示正常,-1表示错误)。传统的处理方式依赖于函数的返回值代表特定的含义,且必须使用相应的条件语句判断并执行相应的操作,因而十分复杂并且容易出错。
    C#语言采用异常来处理系统级和应用程序级的错误状态,它是一种结构化的、统一的和类型安全的处理机制。在程序运行过程中,如果产生错误,则抛出异常;通过try语句来定义代码块,运行可能抛出异常的代码;通过catch语句,可以捕获特定的异常并执行相应的处理;通过finally语句,可以保证即使产生异常(处理失败),也可以在事后清理资源等。

  • 内置的异常类
    在程序运行过程中,如果出现错误,会创建一个异常对象,并抛出给公共语言运行时(CLR)。即程序终止正常执行流程,转而执行异常处理流程。代码中,在某种特殊条件下,也可以创建一个异常对象,并通过throw语句,抛出给公共语言运行时。
    异常对象是异常类的对象实例。C#异常类均派生与System.Exception。
    ① System.Exception类
    System.Exception类是所有异常的基类型,具有以下属性:
    a. Message: string类型的只读属性,包含关于所发生异常的原因的描述(易于人工阅读)。
    b. InnerException: Exception类型的只读属性, 如果它的值不是null,则表示当前异常是在处理那个 InnerException的catch块中被引发的。一般用于链接异常。
    在创建异常对象(即调用其实例构造函数)时指定这些属性。
    ② 公共异常类
    公共语言运行时包含下列异常类:
    a. ArrayTypeMismatchException : 数组类型不匹配异常。数组存储不匹配类型的元素时引发。
    b. DivideByZeroException :零除异常。用零除整数值时引发。
    c. IndexOutOfRangeException:数组越界异常。数组索引越界时引发。
    d. InvalidCastException:非法类型转换异常。类型转换失败时引发。
    e. NullReferenceException:null引用异常。引用值为null的对象时引发。
    f. OutOfMemoryException:内存耗尽异常。使用new运算符分配内存失败时引发。
    g.StackOverflowException:堆栈溢出异常。堆栈因挂起方法调用而耗尽时引发,如深层递归或无限递归会引发该异常。
    h.OverflowException:数值溢出异常。在checked上下文中的算术运算溢出时引发。
    i.TypeInitializationException:在静态构造函数引发异常并且不存在可以捕捉到其兼容catch子句时引发。

  • 自定义异常类
    自定义异常类一般继承于Exception或其子类。自定义异常类的命名规则一般以Error或Exception为后缀。
    根据实际需要,也可以从ApplicationException派生并创建自定义异常。派生类可定义4个构造函数:默认构造函数;设置消息属性的构造函数;设置Message属性和InnerException属性的构造函数;序列化异常的构造函数。

  • 引发异常
    ① 公共语言运行时抛出异常
    大部分程序产生的错误和异常,一般由公共语言运行时自动抛出。
    ② 程序代码抛出异常
    在方法体内,如果判断某种应用程序错误,则可创建相应的异常类的对象,并通过throw语句抛出。
    ③ 抛出异常表达式
    在C#7.0中,支持表达式中直接使用throw关键字抛出异常。

  • 捕获处理异常 try…catch…finally
    ①C#异常捕获机制
    当程序中的某个方法抛出异常后,公共语言运行时通过调用堆栈查找相应的异常捕获程序。如果找到匹配的异常捕获程序(即调用堆栈中某函数使用try…catch语句捕获处理),则执行相应的处理程序(try…catch语句中匹配的catch语句块)。如果堆栈中没有匹配的异常捕获程序,则公共语言运行时捕获处理异常。
    ②公共语言运行时捕获处理异常
    如果堆栈中没有匹配的异常捕获程序,则该异常最后会传递给公共语言运行时,公共语言运行时通用异常处理程序在控制台输出异常的错误信息和调用堆栈,并终止程序的执行。
    ③使用try…catch…finally语句捕获处理异常
    try-catch-finally语句的一般语法形式为

try {  

      // 可能会发生异常的程序代码  

    } catch (Type1 id1) {  

      // 捕获并处理try抛出的异常类型Type1  

      } catch (Type2 id2) {  

      // 捕获并处理try抛出的异常类型Type2  

      } finally {  

      // 无论是否发生异常,都将执行的语句块  

      }  

try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。
④ 重新引发异常:
catch块可以部分处理异常。例如,当产生非法访问异常时,可以使用catch块向错误日志中添加项,但随后重新引发该异常,以便对该异常进行后续处理。

  • 异常过滤器
    异常过滤器是C#的新功能,允许catch捕获异常时使用when关键字和布尔表达式指定额外的过滤条件。例如:
catch(Exception ex)when(ex.GetType()!=typeof(System.OutOfMemoryException)){
//捕获OutOfMemoryException之外的所有异常
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值