第4章 c#中的高级概念

上传人:今*** 文档编号:107153912 上传时间:2019-10-18 格式:PPT 页数:49 大小:109KB
返回 下载 相关 举报
第4章 c#中的高级概念_第1页
第1页 / 共49页
第4章 c#中的高级概念_第2页
第2页 / 共49页
第4章 c#中的高级概念_第3页
第3页 / 共49页
第4章 c#中的高级概念_第4页
第4页 / 共49页
第4章 c#中的高级概念_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第4章 c#中的高级概念》由会员分享,可在线阅读,更多相关《第4章 c#中的高级概念(49页珍藏版)》请在金锄头文库上搜索。

1、第4章 C#中的高级概念,4.1 异常 4.2 委托 4.3 事件 4.4 泛型 4.5 几种特殊类 4.6 字符串和正则表达式,异常是程序运行时产生的错误(如除数为0、网络连接断开等),这种错误和编译错误不同,一般很难在编译时发现,而是在程序运行时产生。如果在程序开发环节没有采取异常处理措施,则程序在发布以后,当用户不小心触发了潜在的异常时,程序就有可能发生崩溃。因此,异常处理就是一个健壮性程序的必要组成部分。 为了能够及时有效地处理程序中的运行错误,作为面向对象的编程语言,在C# 里,引入了异常类。,4.1 异常,4.1.1 异常类 4.1.2 try和catch块 4.1.3 使用thr

2、ow引发异常 4.1.4 finally,4.1.1 异常类,在C#中,.Net框架提供了大量的异常类,这些类存储了各种异常的相关信息和帮助。部分异常类的层次继承结构如图所示。,4.1.2 try和catch块,异常处理的中心是try和catch。这两个关键字通常混合在一起使用。try/catch异常处理模块的语法如下:,try /程序代码 catch(Exception e) /异常处理代码 ,【例4-1】try和catch语句的使用示例,【例4-2】try和多个catch语句的使用示例,4.1.3 使用throw引发异常,若在try块中出现异常,系统将隐式抛出异常,并由随后的catch块捕

3、捉并处理。那么,有没有一种语法能将异常显式地抛给程序并进行处理呢?可以使用throw关键字完成。throw命令只有一个参数,即要抛出的异常对象。,【例4-3】throw语句的使用示例,【例4-4】利用throw语句抛出自定义异常示例,4.1.4 finally,异常处理必须考虑的一个问题是,异常的发生可能引起当前方法的中断,使其过早返回调用者。但是,此方法或许已经打开了某个的文件或建立了数据连接,如果不及时释放这些资源,将会带来一系列问题。C#提供了一个可选的finally块。finally 块的代码用来清理资源或执行要在try块中未执行的其他操作,且无论是否产生异常,finally块都会执行

4、。,【例4-5】finally块使用示例,4.2 委托,4.2.1委托的定义 4.2.2 委托的实例化和使用 4.2.3匿名方法 4.2.4 多路广播委托 4.2.5 多重委托,4.2.1委托的定义,在C#中,定义委托的语法如下: 访问修饰符 delegate 返回类型 DelegateName(参数列表);,4.2.2 委托的实例化和使用,委托是一个类型,定义委托后,必须实例化才能使用。实例化委托的过程就是将委托和方法关联的过程。实例化委托时,将会调用委托的构造函数,并将与委托相关联的方法地址(即方法名)作为参数传递给它。,【例4-6】委托的实例化与使用,4.2.3匿名方法,上面的示例中,委

5、托所关联的方法被称为使用命名的方法。然而为方法创建一个委托,然后通过这个委托调用该方法,在实际中并没有太大意义,因为直接调用方法反而更简单。但当涉及匿名方法时,委托才真正显示出效用。,4.2.4 多路广播委托,前面使用的委托只包含一个方法调用。调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。其实委托也可以包含多个方法,这种委托就是多路广播委托。多路广播委托派生于System.MulticastDelegate。我们可以通过+=来向委托添加调用方法,也可以用-=删除其中的调用方法。,4.2.5 多重委托,多重委托(multicast delegate)是由两个

6、或更多的其它委托构成的委托。它可以封装一个或多个方法。当调用多重委托时,会逐个调用封装的所有方法。 在c#中,通过使用“+”(加法)运算符,可以把某个委托添加到一个多重委托中。类似地,通过“-”(减法)运算符,可以把某个委托从多重委托中删除。也可以把多个委托添加到一个多重委托中。当多重委托被调用时,已经添加委托就按其添加的顺序调用。,【例4-9】多重委托示例,4.3 事件,什么是事件呢?事件和委托有什么关系和区别呢?,在4.2节中,假设小王是你的委托人,帮助你给客户发送资料。当然他采取多种方法完成这个任务,可以发送传真或Email,而且这些方法必须在使用委托之前和委托关联。在本节中,我们用另外

7、一种方式来模拟这个场景。假设,你已事先对小王说,“随时为我服务”。这样,一旦你要发送客户资料,秘书小王一得到这个消息,就马上为你服务。当然,其他人即使得到这个消息也不会为你发送资料的。 现在从程序员的角度来看这个场景,当你向外需要发送资料时,事件发生了。你就是事件的发布者,向外发布一个事件。秘书小王就是事件的订户。他依据事件进行相应的处理,如发邮件或传真,这个过程叫事件处理程序。同时,其他人不会关心事件发布者的话,因为他们没有预定这个事件。,4.3.1定义事件,C#中的事件实际上是委托的一种特殊形式,使用委托调用预定了该事件的对象中的方法。因此需先由发布方定义委托,然后才能定义事件。C#中事件

8、定义的格式如下:,4.3.2预定事件,预定事件就是将发布方的事件和订户的事件处理程序进行绑定的过程,这样,当事件被引发时,将会执行响应的绑定代码。能否预定事件取决于事件是否存在。如果事件存在,要给对象预定事件,只需使用加法赋值运算符(+=)绑定一个当该事件被引发时将调用方法的委托即可。要取消预定预定,可以使用减法运算符(-=)。,4.3.3引发事件,要通知所有已预定了事件的对象,只需引发事件。如下代码: if(condition) AskEvent(); 上面的代码对一个特定的条件进行检查,如果该条件为真,则引发事件AskEvent。可以看出引发事件的语法与调用方法的语法完全相同。引发AskE

9、vent时,将调用预定了该事件的对象的委托,去执行相应的事件处理程序。如果不存在预定事件的对象,却引发事件,则产生异常。,【例4-10】事件的委托类型为无参数的形式示例,【例4-11】事件的委托类型为有参数的形式示例,4.4 泛型,4.4.1 为什么要使用泛型? 4.4.2 泛型方法 4.4.3 泛型类创建与使用 4.4.4类型参数的约束,4.4.1 为什么要使用泛型?,我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在

10、方法中传入通用的数据类型,这样不就可以合并代码了吗?,有人会想到用object这个通用类型,来表示方法中参数的数据类型。但这样做会有以下缺点: 会因为程序员没有记住使用的类型而出错,造成类型不兼容。 值类型和引用类型的互化即装箱拆箱使系统性能下降。 泛型的出现就是专门解决这个问题的,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。泛型和object类型比较有以下优点: 泛型是类型安全的。 使用泛型无需装箱和拆箱操作,不会损害系统性能或工作效率。 使用泛型无需类型转换。,4.4.2 泛型方法,泛型方法是使用类

11、型参数声明的方法。 【例4-12】泛型方法示例,4.4.3 泛型类创建与使用,泛型类封装不是特定于具体数据类型的操作。一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,直至达到通用化和可用性的最佳平衡。,【例4-13】泛型类创建与使用示例,4.4.4类型参数的约束,在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误,这些限制称为约束。约束是使用 where 上下文关键字指定的。类型参数的约束是一个泛型类定义时的可选项。,4.5 几种特殊类,4.5.1 分部

12、类 4.5.2 密封类 4.5.3 内部类 4.5.4 静态类,4.5.1 分部类,一般来说,一个类、结构或接口位于一个源文件中,但某些情况,比如大型项目、特殊部署时,可能需要把一个类、结构或接口放在几个文件中来处理。等到编译时,自动把它们合起来,这就得应用C#分部类了。 【例4-14】分部类使用示例,4.5.2 密封类,当对一个类的声明应用sealed修饰符时,此修饰符会阻止其他类从该类继承。 【例4-15】密封类使用示例,4.5.3 内部类,类的定义是可以嵌套的,即在类的内部还可以定义其他的类。类内声明的类称为内部类(internal class)或者嵌套类(nested class)。

13、内部类能够访问外部类的所有静态成员。创建内部类主要有以下目的: 抽象外部类的某一状态下的行为,内部类仅在外部类的某一特定上下文中存在。 隐藏实现,将内部类设置成private,则仅有外部类可以访问该类。,【例4-17】内部类使用示例,4.5.4 静态类,当对一个类的声明应用static修饰符时,这个类就称作静态类。静态类只用于包含静态成员的类型。静态类的特性是防止继承,防止外部来实例化。静态类有以下特点:,静态类不能有实例构造器,也不能有任何实例成员 静态类不能使用abstract或sealed修饰符。 静态类默认继承自System.Object根类,不能显式指定任何其他基类。 静态类不能指定

14、任何接口实现。 静态类的成员不能有protected或protected internal访问保护修饰符。 静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。,4.6 字符串和正则表达式,4.6.1 System.String类 4.6.2 System.StringBuilder类 4.6.3正则表达式,字符串或串(String)是由零个或多个字符组成的有限序列。一般记为 s=“a1a2an“ (n=0)。它是表示文本的数据类型。但与其他引用类型不同的是,C#将字符串视为一个基本引用类型:可以声明为一个常量,并可以直接赋值。字符串是

15、使用引号声明的。 在本书前面的章节中,我们一直在使用string关键字来定义字符串类型数据。实际上,在C#中字符串是使用string 关键字声明的一个字符数组,string关键字的映射指向.NET基类System.String。System.String是一个功能非常强大且用途非常广泛的基类,但它不是.NET中惟一与字符串相关的类。本节首先介绍System.String的特性,再引入如何使用其他的.NET类来处理字符串,特别是System.Text和 System.Text.RegularExpressions命名空间中的类。,4.6.1 System.String类,System.Strin

16、g类非常重要,专门用于存储字符串,并允许对字符串进行许多操作,以便在C#中使用这个类来很容易地处理字符串。,【例4-19】System.String类中字符串操作方法使用示例,4.6.2 System.StringBuilder类,System.Text.StringBuilder对象表示的字符串是可变的。StringBuilder是.NET提供的动态创建字符串对象的高效方式,以克服String对象不变性带来的性能影响。StringBuilder类对象是以char为单位向字符串分配空间,在字符串的操作中一般不需要进行额外的内存分配,从而克服了对String对象进行多次修改带来的创建大量String对象的问题。,4.6.3正则表达式,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号