《Visual C# NET程序设计基础》课件004.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《Visual C# NET程序设计基础》课件004.ppt》由用户(kld)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C# NET程序设计基础 Visual C# NET程序设计基础课件004 Visual NET 程序设计 基础 课件 004
- 资源描述:
-
1、第4章 高级#概念第第4章章 高级高级C#概念概念4.1 集合集合4.2 异常异常4.3 属性属性4.4 索引器索引器4.5 委托委托4.6 事件事件4.7 综合案例:处理综合案例:处理SARS紧急事件紧急事件本章小结本章小结练习与作业练习与作业上机部分上机部分(四四)第4章 高级#概念 学习目标学习目标 使用集合 理解异常处理机制 使用属性 使用索引器 理解委托和事件机制及其使用第4章 高级#概念4.1 集集 合合 .NET框架的基类库提供了一组“集合”,这是一组通用的数据类型。这些数据类型为对数据进行集中的存储和操作提供了可能。在System.Collections命名空间中包含了许多接口
2、和类,它们定义了对象的各种集合,如列表、队列、数组和字典等。表4-1显示了System.Collections命名空间中的一些集合类。要想学习这些类的使用,可以逐个去研究这些类的方法和属性,但是更好的学习方法是先了解这些集合类可实现的基本接口。我们知道,System.Collection命名空间下也定义了一些接口,每个接口都代表了集合的某个特定功能或特性。表4-2显示了System.Collection命名空间定义的接口。要想成为一个“合格”的集合类,必须去全部或部分实现这些接口,以满足集合的特性。下面我们就先从几个典型的接口入手,看看它们是如何对集合类进行约束的。第4章 高级#概念表表4-1
3、 System.Collections命名空间中的集合类命名空间中的集合类类 描 述 ArrayList 使用大小可按需要动态增加的数组 BitArray 管理位值的压缩数组,该值表示为布尔值 CollectionBase 为强类型集合提供抽象基类 DictionaryBase 为键/值对的强类型集合提供抽象基类 Hashtable 表示键/值对的集合,这些键/值对根据键的哈希代码进行组织 Queue 表示对象的先进先出集合 ReadOnlyCollectionBase 为强类型只读集合提供抽象基类 SortedList 代表一种键/值对的集合、用键排序、用键和索引来访问 Stack 表示对象
4、的后进先出集合 第4章 高级#概念表表4-2 System.Collections下的接口下的接口类 描 述 ICollection 定义所有集合的大小、枚举数和同步方法 IComparer 公开一种比较两个对象的方法 IDictionary 表示键/值对的集合 IDictionaryEnumerator 枚举字典的元素 IEnumerable 公开枚举数,该枚举数支持在集合上进行简单迭代 IEnumerator 支持在集合上进行简单迭代 IEqualityComparer 支持相等的对象比较 IHashCodeProvider 使用自定义哈希函数为对象提供哈希代码 IList 表示可按照索引
5、单独访问的一组对象 第4章 高级#概念4.1.1 ICollection、IList和和IDictionary接口接口 1ICollection和枚举器和枚举器 ICollection接口定义了类似集合的对象所应具备的最基本的特性,所有的集合类都能够实现这个接口。ICollection接口公开了一个只读的Count属性和CopyTo方法,该方法能够把集合对象中的元素复制给数组。此外,ICollection接口还实现了IEnumerable接口,IEnumerable接口定义了GetEnumerator()方法,该方法返回一个枚举器对象。枚举器可以用来读取集合中的数据,但是不能修改这些数据。我们
6、常用的foreach循环支持枚举器。这样一来,所有的集合类都可以通过实现这个接口获得一个枚举器对象,当然我们也可以使用foreach循环达到快速遍历的效果。第4章 高级#概念 注意注意:枚举器和枚举两个术语很容易混淆,但它们是完全不同的概念。枚举是一种命名常量的特殊类型,如:enum ColorRed,Green,Blue 我们可以使用IEnumerator接口操纵枚举器对象。IEnumerator接口中的属性和方法见表4-3。最初,枚举器被定位于集合的第一个元素之前。Reset也是将枚举器返回到此位置。在创建枚举器或调用Reset方法后,如果要读取Current的值,就应该调用MoveNex
7、t方法将枚举器移动到集合的第一个元素。当越过集合的末尾之后,枚举器将返回无效状态。这时调用MoveNext方法将会返回false。此时调用Current将会得到异常。第4章 高级#概念表表4-3IEnumerator接口中的属性和方法接口中的属性和方法 属 性 描 述 Current 获取集合中的当前元素 方 法 描 述 MoveNext 将枚举数推进到集合的下一个元素 Reset 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前 第4章 高级#概念 【例4-1】下面的代码显示了如何遍历一个数组。关于集合的遍历与此类似。static void Main()int arr=new int
8、 1,2,3;IEnumerator e=arr.GetEnumerator();while(e.MoveNext()Console.WriteLine(number:0,e.Current);程序运行结果如图4-1所示。第4章 高级#概念图4-1 例4-1运行结果第4章 高级#概念 如果一个集合类支持枚举器访问,那么我们也可以使用foreach的方法达到快速遍历的效果。上面的代码也可以写成:static void Main()int arr=new int 1,2,3;foreach(int x in arr)Console.WriteLine(number:0,x);2IList和和IDi
9、ctionary接口接口 IList接口表示可单独索引的有序对象集合。Array、ArrayList、StringCollection等类实现了这个接口。IList接口继承自ICollection接口,除此之外,它还定义了自己的属性和方法。表4-4总结了IList接口中的属性和方法。第4章 高级#概念表表4-4 List接口中的属性和方法接口中的属性和方法属 性 描 述 IsFixedSize 通过类实现时,获取一个值,该值指示 IList 是否具有固定大小 IsReadOnly 通过类实现时,获取一个指示 IList 是否为只读的值 方 法 描 述 Add 通过类实现时,将一项添加到 Ili
10、st Clear 通过类实现时,从 IList 中移除所有项 Contains 通过类实现时,确定 IList 是否包含特定的值 IndexOf 通过类实现时,确定 IList 中特定项的索引 Insert 通过类实现时,在 IList 的指定位置处插入一项 Remove 通过类实现时,从 IList 移除特定对象的第一个匹配项 RemoveAt 通过类实现时,在指定的索引处移除 IList 项 第4章 高级#概念 IDictionary是一个关联键/值对的集合的接口。每个关联必须具有一个唯一的非空引用键,但关联的值可以是任何类型的对象,包括null。SortedList、Hashtable和
11、DictionaryBase是实现了该接口的集合类。IDictionary接口的实现分为以下几种类型:(1)只读,不能修改只读的IDictionary。(2)固定大小,固定大小的IDictionary不允许添加和删除元素,但可以修改现有元素。(3)可变大小,可变大小的IDictionary允许添加、修改和删除元素。表4-5总结了IDictionary接口中的成员。第4章 高级#概念表表4-5 IDictionary接口中的成员接口中的成员 属 性 描 述 IsFixedSize 通过类实现时,获取一个值,该值指示 IDictionary 是否具有固定大小 IsReadOnly 通过类实现时,获
12、取一个指示 IDictionary 是否为只读的值 Keys 通过类实现时,获取包含 IDictionary 的键的 ICollection Values 通过类实现时,获取包含 IDictionary 中的值的 ICollection 方 法 描 述 Add 通过类实现时,向 IDictionary 添加带有所提供的键和值的元素 Clear 通过类实现时,从 IDictionary 移除所有元素 Contains 通过类实现时,确定 IDictionary 是否包含带有指定键的元素 GetEnumerator 通过类实现时,返回 IDictionary 的 IDictionaryEnumer
13、ator Remove 通过类实现时,从 IDictionary 中移除带有指定键的元素 第4章 高级#概念4.1.2 ArrayList类类 ArrayList是实现了IList接口的集合类,我们可以将其视作Array和Collection对象的混合体。对于该类中的元素,既可以像处理数组一样通过元素索引确定其地址,对元素进行排序和搜索,也可以象处理集合那样添加一个元素,在给定位置插入元素或删除元素。ArrayList和Array之间的区别如下:Array是抽象类,所有的数组均派生自此类;ArrayList是一个普通类,可以被实例化。在Array中一次只能获取或设置一个元素的值;ArrayLi
14、st则提供了操作元素的一系列方法,包括插入、删除和添加等。第4章 高级#概念 ArrayList具有Capacity属性。使用此属性可以使ArrayList的容量自动扩展。如果属性ArrayList.Capacity的值被修改,则会自动进行内存的重新分配和元素的复制。这样,当有元素被添加到ArrayList中时,其容量的上限会动态增加。而Array的容量是固定的,因而不会被修改。可以设置Array的下限,而ArrayList的下限始终为0。Array可以有多维,而ArrayList只有一维。【例例4-2】下面的代码显示了如何使用ArrayList类,添加元素和遍历。using System;u
15、sing System.Collections;第4章 高级#概念 class Class2 static void Main(string args)ArrayList myal=new ArrayList();/创建ArrayList对象myal.Add(欢迎);/添加元素myal.Add(使用);myal.Add(C#);myal.Add(!);Console.WriteLine(nt我的表单);Console.WriteLine(数量:0,myal.Count);Console.WriteLine(容量:0,myal.Capacity);Console.Write(内容:);IEnum
16、erator myErtor=myal.GetEnumerator();/获得枚举器第4章 高级#概念 while(myErtor.MoveNext()/遍历元素 Console.Write(0,myErtor.Current);Console.WriteLine();上述示例的运行结果如图4-2所示。注意,ArrayList的数量和容量往往是不一致的。ArrayList的初始容量是16,当数量超过ArrayList的容量时,其容量Capacity会增长一倍。此外,该示例中还使用了IEnumerator接口来访问ArrayList中的每一个元素,这是因为ArrayList集合实现了IEnume
17、rable接口,并实现了它的唯一方法GetEnumerator。GetEnumerator方法返回一个实现了IEnumerator接口的遍历器,该遍历器用于访问ArrayList集合中的每一个元素。第4章 高级#概念图4-2 例4-2运行结果第4章 高级#概念4.1.3 SortedList类类 SortedList类实现了IDictionary接口,该类在内部维护了两个动态数组,一个用于存放键,另一个用于存放相关联的值,SortedList对象中的每一个元素都是一个键/值对。注意,无论何时,SortedList都不允许有重复的键。Count属性用来获取SortedList所包含的元素个数,A
18、dd方法用来向SortedList添加一个元素。【例4-3】下面的代码显示了如何使用SortedList,添加元素和遍历。using System;using System.Collections;class Class1第4章 高级#概念 static void Main(string args)SortedList mysl=new SortedList();/创建SortedList对象mysl.Add(First,1);/添加元素mysl.Add(Third,3);mysl.Add(Second,2);Console.WriteLine(Count:0,mysl.Count);Cons
19、ole.WriteLine(t-KEY-t-VALUE-);for(int i=0;i100|userinput1)throw new InvalidNumberInputException(userinput+不是有效输入);第4章 高级#概念 在throw语句中,使用new创建了InvalidNumberInputException对象。请记住,throw抛出对象,而不是异常类型。在这里,InvalidNumberInputException是一个用户自定义异常,也可以直接使用系统提供的异常类型。如果抛出的异常没有被捕获,则程序将会出现致命错误。因此在抛出异常时应确保该异常一定会被捕获。若
20、要捕获所有可能异常的一部分,并把剩下的委派给调用者,throw 语句就特别有用。这是非常普遍的编程方式:代码的每个部分都处理它们知道该如何解决的错误,并将其他的错误留给调用代码。正如前面说明过的,如果没有 catch 表达式捕获当前异常,异常会自动抛给调用者。但使用显式完成抛出动作是好的习惯,因为这样更清楚地表明你是一个严谨的开发人员。下列代码演示了这种编程方式。第4章 高级#概念try/程序代码catch(DividedByZeroException e)/错误处理代码1catch(FormatException e)/错误处理代码2catch(Exception e)/显式抛出这个未处理的
21、异常给调用者throw;第4章 高级#概念 在上面的代码段中,不带参数的 throw 语句重新抛出当前异常,这种形式的throw语句必须出现在catch结构中才有效。在这种情况下,该语句重新引发当前正由该catch块处理的那个异常并由该语句块的上级调用端捕获。与有参数情况的区别是,后者还重置了异常对象的StackTrace属性(就像创建了一个新的异常)。所以对于重新抛出相同的异常,不带参数更好,因为它能让调用程序正确地确定异常发生位置。【例4-5】下面的代码演示了如何向上抛出一个异常并进行捕获。using System;public class ThrowTest第4章 高级#概念static
22、 void Main()try OutSide();catch(Exception e)Console.WriteLine(e.StackTrace);public static void OutSide()第4章 高级#概念 try InSide();catch throw;public static void InSide()throw new Exception(throw by InSide);第4章 高级#概念 在上面的代码中,Main调用OutSide方法,OutSide方法调用InSide方法,InSide方法抛出一个异常被OutSide捕捉,并使用throw将其重新抛出。这个异
23、常最终由它的上级调用者Main捕获。程序的输出如图4-8所示,注意此时异常的StackTrace属性已经重置了。第4章 高级#概念图4-8 异常的StackTrace信息 第4章 高级#概念4.2.4 自定义异常对象自定义异常对象 如上一节中的代码所示,可以使用throw 命令创建一个新的 System.Exception 对象(或继承自System.Exception 的对象)并设置它的Message属性,但不能实现更进一步的功能。有时需要完整地创建一个新的异常对象,根据.NET规则,新对象应该继承自System.ApplicationException(与继承自System.SystemE
24、xception的.NET运行时环境异常相反)。下面的代码将会展示如何创建继承自System.ApplicationException的类,并用构造函数对异常的Message属性赋值。第4章 高级#概念 【例例4-6】下面的代码演示了如何自定义异常对象。/如何抛出自定义异常 using System;public class Throw static void Main()try Console.WriteLine(即将抛出异常);throw new myOwnException(这是我自己的异常);第4章 高级#概念 catch(myOwnException e)Console.WriteL
25、ine(e.Message);Console.WriteLine(继续执行);public class myOwnException:ApplicationException /自定义异常类 public myOwnException():base()/调用基类无参构造函数 public myOwnException(string message):base(message)/调用基类有参构造函数第4章 高级#概念 程序的运行结果如图4-9所示。自定义异常对象除了能报告自定义的错误消息外还有很多其他用途。比如,它们可以包括用来解决错误(或至少尝试这么做)的自定义方法。举例说明:用户可能想设计一
展开阅读全文