书签 分享 收藏 举报 版权申诉 / 161
上传文档赚钱

类型《Visual C# NET程序设计基础》课件004.ppt

  • 上传人(卖家):kld
  • 文档编号:8227794
  • 上传时间:2025-01-14
  • 格式:PPT
  • 页数:161
  • 大小:1.13MB
  • 【下载声明】
    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所示。自定义异常对象除了能报告自定义的错误消息外还有很多其他用途。比如,它们可以包括用来解决错误(或至少尝试这么做)的自定义方法。举例说明:用户可能想设计一

    26、个DriveNotReady-Exception类,其中包含一个名为ShowMessage 的方法用来显示错误信息,并请求在驱动器中插入光盘然后重试操作。可以将这些代码放在异常类中,使它们的可重用性更好。第4章 高级#概念图4-9 例4-6运行结果第4章 高级#概念4.2.5 使用使用finally 异常处理必须考虑的一个问题是,异常的发生可能引起当前方法的中断,使其过早返回。然而,此方法或许已经打开了需要关闭的文件或数据连接,若未及时释放这些资源,将带来一系列问题。C#提供了一个可选的finally块。如果在该块内指定了语句,无论控制流如何,都会执行这些语句。图4-10说明了其运行流程。第4

    27、章 高级#概念图4-10 异常的运行流程 第4章 高级#概念 【例例4-7】下面的代码演示了如何使用finally语句。static void Main()int divident=50;int userInput;int quotient=0;Console.WriteLine(请输入一个数字:);try userInput=Convert.ToInt32(Console.ReadLine();/将用户输入转换成整数 quotient=divident/userInput;catch(System.FormatException excepE)/格式异常第4章 高级#概念 Console.W

    28、riteLine(excepE.Message);catch(System.DivideByZeroException excepE)/除0异常Console.WriteLine(excepE.Message);catch(System.OverflowException excepE)/溢出异常 Console.WriteLine(excepE.Message);第4章 高级#概念 finallyif(quotient!=0)Console.WriteLine(商为0,quotient);在try块中有两个语句,因为有可能出现下列错误:用户可能输入字符串;用户可能输入零;用户输入的数字超出了

    29、int类型的最大范围。所以,编写了三个catch块。如果出现上述异常中的任何一个,程序都会终止,并向用户显示相关的异常信息和出处,说明程序为何关闭。第4章 高级#概念 在finally块中,检查去quotient是否为0。如果得到的结果不为0,就将其显示给用户。程序可能的运行结果如图4-11所示。最后请注意,如果finally语句块中的代码抛出异常,程序则会立即跳出finally语句块,并将异常抛给调用者。因此,必须仔细检查 finally 代码块中的代码,以保证finally代码在执行时不发生任何错误;如果不能保证没有错误发生,则应该在 finally 语句块中使用嵌套的trycatch 的

    30、结构。第4章 高级#概念图4-11 例4-7各种可能的运行结果第4章 高级#概念4.3 属属 性性 属性是类的成员,它们提供了通过访问器读、写或计算私有字段值的灵活机制。如同本书前面一些示例所示,类的创建者往往想要创建一个对象使用者能使用的字段,而保持对该字段的操作控制。例如,可能想要限制该字段的赋值范围。请先研究下面的示例:using System;class Student public string sName;public string sAge;class Test public static void Main()第4章 高级#概念 Student std1=new Student

    31、();Console.WriteLine(输入学生姓名:);std1.sName=Console.ReadLine();Console.WriteLine(输入学生年龄:);std1.sAge=Console.ReadLine();Console.WriteLine(姓名:0,年龄:1,std1.sName,std1.sAge);虽然上述会产生正常的结果,但将类的数据成员公开不是好的编程方法。因为我们在使用用户输入示例的数值前没有进行验证,所以用户可以输入任何值(上例中年龄值不合常理)。如果要实现验证,可以在Student类中编写一个方法,该方法获取字段的值并进行判断。第4章 高级#概念 下面

    32、的代码演示了这种方式:class Student public string sName;private string sAge;public void Set(string value)int age=Convert.ToInt16(value);if(age150)sAge=0;elsesAge=value;第4章 高级#概念 public String Get()return sAge;设置sAge字段的值时,需要调用Set方法,获取该字段的值则需要调用Get方法。显然,为每一个字段编写两个方法是非常繁琐的,很难实现类的封装性和安全性。C#的属性提供了一种更好、更直接的方式,它的基本形式

    33、为:type name get /获得域变量的值 第4章 高级#概念 set /设置域变量的值 其中,type指定属性的类型,name指定属性的名称。get访问器和set访问器用于读取和设置字段的值。【例例4-8】下面的代码演示了属性的创建和使用。class Student public string sName;private string sAge;public string Age/Age属性封装了sAgegetreturn sAge;setsAge=value;第4章 高级#概念 class Test public static void Main()Student std1=new

    34、Student();std1.sName=Mike;std1.Age=12;/设置属性Console.WriteLine(姓名:0,年龄:1,std1.sName,std1.Age);/读取属性 上面的例子对私有字段sAge进行了属性封装,在测试类中,均通过属性Age进行读取和设置。程序的运行结果如图4-12所示。第4章 高级#概念图4-12 例4-8运行结果第4章 高级#概念 分析上面的程序,我们发现,属性由两部分组成:get访问器和set访问器。这里的访问器不是方法,而是用大括号括起来的代码段。属性是对字段的封装,get访问器用于获取字段的值,采用的是return语句;而set访问器则是将

    35、外部的值赋给该字段,其中value是关键字,表示外部值。这样,对属性的读/写操作实际上是对字段的操作。图4-13详细地说明了工作过程。第4章 高级#概念图4-13 属性的工作过程第4章 高级#概念4.3.1 属性的类型属性的类型 属性可以分为以下三种不同的类型。1读读/写属性写属性 读/写属性是既有set访问器又有get访问器的属性。上面例子中的属性均属于这一类型。这种类型的属性同时提供对数据成员的读访问和写访问的能力。2只读属性只读属性 只有get访问器的属性称为只读属性。【例例4-9】下面的代码演示了只读属性的创建和使用。public class Student private int a

    36、verageScore=70;public int AverageScore/只读属性getreturn averageScore;第4章 高级#概念 class Test static void Main()Student s1=new Student();Console.WriteLine(平均分为0,s1.AverageScore);/读取属性的值/s1.AverageScore=88;此行将产生编译错误,试图对只读属性赋值 第4章 高级#概念 在该例中,我们创建了类Student的只读属性AverageScore。在Main函数中,实例化该对象后读取该属性值并显示出来。在对该属性赋值时

    37、,系统将产生编译错误,原因是AverageScore属性缺少set访问器,无法对其进行写操作。既然只读属性不允许修改,有没有其他的方法可以操作字段的值呢?我们可以使用方法来完成这个任务。请看以下代码段:public class Student private int averageScore=70;第4章 高级#概念 public int AverageScore /只读属性,不能改变字段的值getreturn averageScore;public void ChangeScore()/改变字段值的方法averageScore+=10;第4章 高级#概念 3只写属性只写属性 只写属性与只读属

    38、性正好相反,这种类型的属性只包含set访问器。因为这种属性没有get访问器,所以只能对其赋值,而不能检索它的值。如果试图检索它的值,编译器就会出现错误。一般认为只写属性是没有意义的,只起到一个对称的作用。所以,我们不再进一步讨论只写属性。注意注意:在.NET2.0版本中,get和set访问器的访问修饰符可以不同,通常是在保持get访问器可公开访问的情况下,限制set访问器的可访问性。第4章 高级#概念4.3.2 属性约束属性约束 属性有一些重要的约束。第一,因为属性不定义存储位置,所以它不能作为ref参数或out参数传递给方法。第二,用户不能重载属性。可以有两个不同的、但访问相同变量的属性,但

    39、这将是异常的。最后,调用get访问器时,属性最好不要改变默认变量的状态,但编译器不强制使用此规则。get操作应该是非侵入性的。由此我们引出属性与字段的比较:(1)属性是逻辑字段。属性通过get方法和set方法实现对字段的封装。在get方法和set方法中,甚至可以改变原始变量的值。第4章 高级#概念 (2)属性是字段的扩展。属性必须和所封装的字段保持相同的返回值。与字段类似,属性也可以附加任何访问修饰符,属性也可以是static的。(3)与字段不同,属性不直接对应于存储位置。属性与方法不同,既不使用圆括号,也不必指定void,而对实现相似功能的方法而言,则是必须的。第4章 高级#概念4.4 索索

    40、 引引 器器 索引器是C#特有的一种访问技术。假设在类中定义了一个数组,在访问数组元素时,传统的做法是在对象名后指定数组名,同时指定要访问元素的索引值,才能进行赋值等操作。用C#的索引器技术,可以为该数组创建索引器,然后通过从对象直接指定索引的方式来访问数组里的元素。这两种方式从功能上说是等价的。请看下面的代码段:string name1=listBox1.Items0.ToString()/传统方法 string name2=listBox10.ToString()/索引器方法 第4章 高级#概念 在上面的代码中,listBox1对象有一个数组成员Items,要获取列表框listBox1的第

    41、一个数据项的值,传统的方法如第一行所示。由于使用了索引技术,我们也可以采用第二行的方法直接通过对象索引的方式获取。4.4.1 索引器的创建索引器的创建 一维索引器的语法如下:AccessModifier ReturnType thisDataType Index get/set/其中,AccessModifier是访问修饰符。ReturnType是索引的基类型,因此索引访问的每个元素应该是ReturnType类型。参数Index接收被访问元素的下标。理论上,该参数不必是int类型,但是,因为索引通常用来提供数组索引,所以常为整数类型。第4章 高级#概念 与属性一样,索引也定义了两个访问器:ge

    42、t和set。使用索引时,自动调用访问器,且这两个访问器都接收Index作为参数。【例例4-10】下面的代码演示了索引器的创建和使用。class SampleCollection private T arr=new T100;/泛型数组 public T thisint i /为泛型数组创建泛型索引器 get return arri;set第4章 高级#概念 arri=value;/调用类class Program static void Main(string args)SampleCollection stringCollection=new SampleCollection();strin

    43、gCollection0=Hello,World;/使用索引器对其数组成员赋值 System.Console.WriteLine(stringCollection0);/使用索引器将数组成员打印出来 第4章 高级#概念 上面的代码首先定义了一个泛型类SampleCollection,并为其提供了简单的get和set访问器方法(作为分配和检索值的方法)。注意索引器必须命名为this,因为要访问的索引器必须是它们所属的对象。Program类为存储字符串创建了此类的一个实例,随后一行使用索引器来设置类中数组成员arr的第一个值,接着输出该值。程序最终将显示Hello,World。注意:泛型是.NET

    44、2.0的一个新功能。泛型将类型参数引入.NET Framework,使用泛型类型参数,可以编写客户端代码能够使用的单个类,而不会导致运行时强制转换或装箱带来的风险。第4章 高级#概念 声明索引器的步骤如下:(1)指定索引器的访问修饰符。(2)说明索引器的返回类型(get访问器的返回类型)。(3)指定this关键字。(4)指定索引的数据类型(与数组不同,索引器的索引不一定为整型)。(5)指定声明索引的变量名。(6)最后完成get和set访问器的内容,如同定义属性一样。在接下来的例子中,我们来看看如何使用字符串作为索引器的索引。第4章 高级#概念 【例例4-11】下面的代码演示了具有字符串索引的索

    45、引器的创建和使用。class DayCollection string days=Sun,Mon,Tues,Wed,Thurs,Fri,Sat;private int GetDay(string testDay)int i=0;foreach(string day in days)if(day=testDay)return i;第4章 高级#概念 i+;return-1;public int thisstring day get return(GetDay(day);class Program static void Main(string args)第4章 高级#概念 DayCollecti

    46、on week=new DayCollection();System.Console.WriteLine(weekFri);System.Console.WriteLine(weekMade-up Day);在此例中,声明了存储星期几的类,同时声明了一个get访问器,它接受字符串(无名称),并返回相应的整数。例如,星期日将返回0,星期一将返回1,等等。注意,这是一个只读索引,试图对该索引赋值都讲产生错误。最后的输出是:5 -1第4章 高级#概念4.4.2 多参数索引器多参数索引器 在索引器中可以指定一个以上的索引器参数。多个参数意味着要以类似于访问多维数组的方式访问索引器。【例例4-12】下面

    47、的代码演示了多参数索引器的创建和使用。public class Array2D int,a;int rows,cols;public Array2D(int r,int c)/构造函数rows=r;cols=c;a=new int rows,cols;第4章 高级#概念 public int thisint index1,int index2 /二参数索引器 getreturn aindex1,index2;/返回二维数组的一个元素 setaindex1,index2=value;/对二维数组的一个元素赋值 public class Test static void Main()Array2D

    48、 arr=new Array2D(2,3);for(int i=0;i2;i+)for(int j=0;j3;j+)arri,j=i+j;/设置索引器第4章 高级#概念 Console.Write(arri,j+);/显示索引器 Console.WriteLine();在上述示例中,定义的二维索引为该类中的二维数组a进行包装。在读取该数组的值时,完全不用调用数组a(同时a也是私有的,无法调用),而直接采用类名调用即可。该示例的输出结果为:0 1 2 1 2 3第4章 高级#概念4.5 委委 托托 什么是委托?在现实生活中,委托就是让别人去代替自己办事。比如你有一份资料要发给客户,而自己不便亲自

    49、去做。这时可以派助手小王去给用户发传真,也可以让小王发电子邮件。处理的方法有很多种,小王只需要获得你的授权拿到资料就可以为你办事了。在C#中,可以把委托看做一个方法指针,该指针在不同时刻可以指向不同的方法,并且可以通过该委托执行这些方法。委托如何做到这点呢?在面向对象的程序设计中,委托是能够引用方法的对象。因此,创建委托时,创建的是能够存储方法引用的对象。怎样第4章 高级#概念理解方法的引用?我们知道,引用的本质是内存地址,因此,对象引用就是对象的地址。方法虽然不是对象,它同样在内存中有一个物理位置,而且其入口点就是调用方法时调用的地址。将此地址传给委托,一但委托引用一个方法,就能够通过该委托

    50、来调用该方法。例如,假设有两个方法MulFun和AddFun。MulFun接受两个整型参数,返回它们的乘积。AddFun接受两个整型参数,返回它们的和。既然两个方法的参数个数、类型和返回值类型都一样,就可以创建一个委托CalFunDelegate,使其在某个时刻指向MulFun,在某个时刻指向AddFun。如果该委托在指向MulFun时调用,则将对委托中传递的参数做乘法计算;如果该委托在指向AddFun时调用,则将对委托中传递的参数做加法计算。第4章 高级#概念4.5.1 定义委托定义委托 定义委托的语法如下:AccessModifier delegate ReturnType Delegat

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《Visual C# NET程序设计基础》课件004.ppt
    链接地址:https://www.163wenku.com/p-8227794.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库