C#程序设计经典教程ppt课件

上传人:29 文档编号:240774088 上传时间:2024-05-07 格式:PPT 页数:37 大小:432.83KB
返回 下载 相关 举报
C#程序设计经典教程ppt课件_第1页
第1页 / 共37页
C#程序设计经典教程ppt课件_第2页
第2页 / 共37页
C#程序设计经典教程ppt课件_第3页
第3页 / 共37页
点击查看更多>>
资源描述
1C#程序设计经典程序设计经典教程教程1C#程序程序设计经设计经典教程典教程1第六章第六章集合、索引器与泛型1.总体要求总体要求l了解了解.NET类库中的集合类,初步掌握常用集合的创建和操作类库中的集合类,初步掌握常用集合的创建和操作方法。方法。l理解索引器的概念,能区别索引器与属性,掌握索引器的定理解索引器的概念,能区别索引器与属性,掌握索引器的定义与使用。义与使用。l了解泛型的相关概念,初步掌握泛型接口、泛型类、泛型属了解泛型的相关概念,初步掌握泛型接口、泛型类、泛型属性和泛型方法的使用。性和泛型方法的使用。2.相关知识点相关知识点l熟悉类和数组的定义和使用。熟悉类和数组的定义和使用。l熟悉类的方法成员的定义与使用等基本操作。熟悉类的方法成员的定义与使用等基本操作。第六章第六章集合、索引器与泛型集合、索引器与泛型1.总总体要求体要求23.学习重点学习重点l集合、索引器、泛型的定义与使用。集合、索引器、泛型的定义与使用。4.学习难点学习难点l索引器的作用、定义与使用方法索引器的作用、定义与使用方法l泛型的概念和意义,泛型的定义和使用方法泛型的概念和意义,泛型的定义和使用方法第六章第六章集合、索引器与泛型3.学学习习重点第六章重点第六章集合、索引器与泛型集合、索引器与泛型3第六章第六章集合、索引器与泛型主要内容主要内容l l6.1集合集合l l6.2索引器索引器l l6.3泛型泛型第六章第六章集合、索引器与泛型主要内容集合、索引器与泛型主要内容46.1集合集合l6.1.1集合概述集合概述l6.1.2ArrayListl6.1.3哈希表哈希表Hashtablel6.1.4栈和队列栈和队列6.1集合集合6.1.1集合概述集合概述56.1.1集合概述集合概述l集合能随意调整大小集合能随意调整大小,集合可以把一组类似的对象组合在一集合可以把一组类似的对象组合在一起。任何类型的对象都可被组合到一个起。任何类型的对象都可被组合到一个Object类型的集合类型的集合中,并通过中,并通过C#的的foreach语句来访问其中的每一个对象。语句来访问其中的每一个对象。操作过程中操作过程中MyClass的对象与的对象与Object对象之间对象之间MyClassmcObj;装箱:装箱:Objectobj=mcObj(无需显式转换无需显式转换)拆箱:拆箱:mcObj=(MyClass)obj(事先装箱的)(事先装箱的)l对象类型的集合位于对象类型的集合位于System.Collections命名空间;命名空间;6.1.1集合概述集合能随意集合概述集合能随意调调整大小整大小,集合可以把一集合可以把一组类组类似似6“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。6.1数组类数组类Arrayn n数组是简单集合数组是简单集合数组是简单集合数组是简单集合n nSystem.ArraySystem.Array类是所有数组的基类类是所有数组的基类类是所有数组的基类类是所有数组的基类(特殊类,不能用于派生特殊类,不能用于派生特殊类,不能用于派生特殊类,不能用于派生)publicabstractclassArray:ICloneable,IList/类体:实现了多个接口类体:实现了多个接口/(数组操作的常用属性和方法,多为静态)(数组操作的常用属性和方法,多为静态)interfaceICollectioninterfaceICollection intCountget;voidCopyTo(Arrayarray,intindex);boolIsSynchronizedget;boolIsSynchronizedget;objectSynchRootget;objectSynchRootget;interfaceICloneableobjectClone();interfaceIList:interfaceIList:Collection,IEnumerable intAdd(objdectvalue);voidClear();voidClear();boolContains(objectvalue);boolContains(objectvalue);intIndexOf(objectvalue);intIndexOf(objectvalue);voidRemove(objectkey);voidRemoveAt(intindex);voidRemoveAt(intindex);voidInsert(intindex,objectvalue);interfaceIEnumeratorObjectCurrentget;boolMoveNext();voidReset()interfaceIEnumerableinterfaceIEnumerable/foreach/foreach遍历的基础遍历的基础遍历的基础遍历的基础 IEnumeratorGetenumerator();Getenumerator();publicstaticvoidMain()inta=newint3;Arrayb=Array.CreateInstance(typeof(int),3);for(inti=0;i3;i+)aI=2*i;b.SetValue(3*i,i);foreach(intxina)console.Write(“0”,x);foreach(intxinb)console.Write(“0”,x);接口中的方法:接口中的方法:默认是默认是publicabstract的。的。继承接口的类:继承接口的类:必须实必须实现接口中的所有属性和现接口中的所有属性和方法,否则该类是抽象方法,否则该类是抽象的。的。6.1数数组类组类Array数数组组是是简单简单集合集合publicab7“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。6.1.4栈和队列栈和队列l1栈栈StackStack类实现了先进后出的数据结构,类实现了先进后出的数据结构,这种数据结构在插入或删除对象时,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。只能在栈顶插入或删除。创建栈对象的一般形式如下:创建栈对象的一般形式如下:Stack栈名栈名=newStack();lStack类提供了栈常用操作方法,包括在栈顶添加数据、移类提供了栈常用操作方法,包括在栈顶添加数据、移除栈顶数据、返回栈顶数据、清空栈和检查是否包含某个除栈顶数据、返回栈顶数据、清空栈和检查是否包含某个数据等,方法名分别为数据等,方法名分别为Push、Pop、Peek、Clear和和Contains。其中,。其中,Push和和Pop每操作一次只能添加或删除每操作一次只能添加或删除一个数据。一个数据。a1a1a2a2anan栈底栈底栈顶栈顶出栈出栈进栈进栈6.1.4栈栈和和队队列列1栈栈Stacka1a2an栈栈底底栈顶栈顶出出8“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。6.1.4栈和队列栈和队列l2队列队列QueuelQueue类实现了先进先出的数据结构,这种数据结构把对类实现了先进先出的数据结构,这种数据结构把对象放进一个等待队列中,当插入或删除对象时,对象从队象放进一个等待队列中,当插入或删除对象时,对象从队列的一端插入,从另外一端移除。列的一端插入,从另外一端移除。l队列可以用于顺序处理对象,因此队列可以按照对象插入队列可以用于顺序处理对象,因此队列可以按照对象插入的顺序来存储。的顺序来存储。创建队列对象的一般形式如下:创建队列对象的一般形式如下:Queue队列名队列名=newQueue(队列长度队列长度,增长因子,增长因子);l其中,队列长度默认为其中,队列长度默认为32。增长因子默认为。增长因子默认为2.0,即每当队,即每当队列容量不足时,队列长度调整为原来的列容量不足时,队列长度调整为原来的2倍,可重新设置增倍,可重新设置增长因子的大小。长因子的大小。a1a2a3ana1a2a3an队头队头队尾队尾出队出队入队入队6.1.4栈栈和和队队列列2队队列列Queuea1a29“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。集合类的选择集合类的选择选择集合类时,一般要考虑以下问题:选择集合类时,一般要考虑以下问题:(1)是否需要一个序列列表,需要先进先出行为时可使用)是否需要一个序列列表,需要先进先出行为时可使用Queue队队列类,在需要后进先出行为时可使用列类,在需要后进先出行为时可使用Stack栈类。栈类。(2)是否需要随机访问集合中的元素,此时不能选择)是否需要随机访问集合中的元素,此时不能选择Queue队列类、队列类、Stack栈类、栈类、LinkedList双向链表类双向链表类(3)是否需要通过索引访问每个元素,只有)是否需要通过索引访问每个元素,只有ArrayList、StringCollection等是从索引为零的元素开始逐个访问集合元素。等是从索引为零的元素开始逐个访问集合元素。Hashtable、Dictionary通过元素的键(即元素名字)提供对元素通过元素的键(即元素名字)提供对元素的访问。而的访问。而NameValueCollection类和类和SortedList泛型类通过其泛型类通过其元素的从零开始的索引,或者通过其元素的键提供对元素的访问。元素的从零开始的索引,或者通过其元素的键提供对元素的访问。(4)是否包含一个值、一个键和一个值的集合,还是一个键和多个值)是否包含一个值、一个键和一个值的集合,还是一个键和多个值的集合。其中,的集合。其中,“一个值一个值”的集合是一种基于的集合是一种基于IList列表接口派生列表接口派生的集合,的集合,“一个键和一个值一个键和一个值”的集合是一种基于的集合是一种基于IDictionary字典字典接口的集合,接口的集合,“一个键和多个值一个键和多个值”的集合是的集合是NameValueCollection类。类。10集合集合类类的的选择选择选择选择集合集合类时类时,一般要考,一般要考虑虑以下以下问题问题:10“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。集合类的选择集合类的选择(续续)(5)是否需要用与输入元素方式不同的方式对元素排序。)是否需要用与输入元素方式不同的方式对元素排序。Hashtable按其元素的哈希代码对元素排序,按其元素的哈希代码对元素排序,SortedList以及以及SortedDictionary根据根据IComparer实现按键对元素实现按键对元素的排序,而的排序,而ArrayList提供提供Sort排序方法。排序方法。(6)是否需要信息的快速搜索和检索,对于小集合()是否需要信息的快速搜索和检索,对于小集合(10个元个元素或更少),素或更少),ListDictionary比比Hashtable快,快,SortedDictionary泛型类提供比泛型类提供比Dictionary泛型类更快泛型类更快的查找。的查找。(7)是否需要只接受字符串的集合,如)是否需要只接受字符串的集合,如StringCollection和和StringDictionary等。等。11集合集合类类的的选择选择(续续)(5)是否需要用与)是否需要用与输输入元素方式不同的方式入元素方式不同的方式对对“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。三、集合的创建与操作三、集合的创建与操作l1.动态数组类动态数组类ArrayListl2.队列队列Queuel3.栈栈Stackl4.哈希表哈希表Hashtablel5.字符串字典字符串字典StringDictionary12三、集合的三、集合的创创建与操作建与操作1.动态动态数数组类组类ArrayList12“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。1.动态数组类动态数组类ArrayListlArrayList:可以看作是能够自动增长容量:可以看作是能够自动增长容量的动态数组,它实现了的动态数组,它实现了IList接口。接口。(1)Capacity集合容量,读写属性集合容量,读写属性(2)Count获取列表中实际包含元素的个数获取列表中实际包含元素的个数(3)Add()方法:列表末尾添加元素方法:列表末尾添加元素(4)Insert()方法:列表指定位置添加元素方法:列表指定位置添加元素(5)Remove()方法:移除特定对象方法:移除特定对象(6)RemoveAt()方法:根据索引值移除对象方法:根据索引值移除对象1.动态动态数数组类组类ArrayListArrayList:可以看:可以看13“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。1.动态数组类动态数组类ArrayListl(1)ArrayList与与Array的区别的区别Array的大小是固定的,而的大小是固定的,而ArrayList的大小可根据需要自动的大小可根据需要自动扩充;扩充;在在Array中一次只能获取或设置一个元素的值,而在中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;中允许添加、插入或移除某一范围的元素;Array的下限可以自定义,而的下限可以自定义,而ArrayList的下限始终为零;的下限始终为零;Array可以具有多个维度,而可以具有多个维度,而ArrayList始终只是一维的;始终只是一维的;Array位于位于System命名空间中,命名空间中,ArrayList位于位于System.Collections命名空间中。命名空间中。l(2)创建动态数组创建动态数组:ArrayList列表对象名列表对象名=newArrayList();例如例如,ArrayListlist=newArrayList();list.Add(罗福强罗福强);list.Add(30);141.动态动态数数组类组类ArrayList(1)ArrayLis“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。2.队列队列Queuel队列的特点队列的特点一种先进先出的数据结构,当插入或删除对象时,对象从队列的一一种先进先出的数据结构,当插入或删除对象时,对象从队列的一端插入,从另外一端移除端插入,从另外一端移除l创建队列对象创建队列对象Queue队列名队列名=newQueue(队列长度队列长度,增长因子,增长因子);说明,队列长度默认为说明,队列长度默认为32,增长因子默认为,增长因子默认为2.0(即每当队列容量不足(即每当队列容量不足时,队列长度调整为原来的时,队列长度调整为原来的2倍)倍)注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。造队列时指定队列的长度。l队列包括队列包括Enqueue、Dequeue、Peek、Clear和和Contains等方法。等方法。其中,其中,Enqueue和和Dequeue每操作一次只能添加或删除一每操作一次只能添加或删除一个数据。个数据。l例如:例如:Queueq=newQueue(50,3.0);q.Enqueue(董涛董涛);q.Enqueue(徐磊徐磊);152.队队列列Queue队队列的特点列的特点15“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。3.栈栈Stackl栈的特点:栈的特点:一种先进后出的数据结构,这种数据结构在插入或删除一种先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。对象时,只能在栈顶插入或删除。l创建栈对象:创建栈对象:Stack栈名栈名=newStack();l栈包括栈包括Push、Pop、Peek、Clear和和Contain等方法。其等方法。其中,中,Push和和Pop每操作一次只能添加或删除一个数据。每操作一次只能添加或删除一个数据。l例如:例如:Stacks=newStack();s.Push(成都成都);s.Push(四川四川);163.栈栈Stack栈栈的特点:的特点:16“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。4.哈希表哈希表Hashtablel哈希表又称散列表,表示键哈希表又称散列表,表示键/值对的集合。值对的集合。l哈希表的特点:哈希表的特点:在保存集合元素时,首先要根据键自动计算哈在保存集合元素时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特定存储桶中搜索定存储桶中搜索。l创建哈希表对象创建哈希表对象Hashtable哈希表名哈希表名=newHashtable(哈希表长度哈希表长度,增长因子增长因子);说明,默认长度为说明,默认长度为0,默认增长因子为,默认增长因子为1.0l哈希表包括哈希表包括Add、Remove、Clear和和Contains等方法。等方法。其其中,中,Add方法需要两个参数,一个是键,一个是值;方法需要两个参数,一个是键,一个是值;Remove方法只需要一个键名参数。方法只需要一个键名参数。l例如:例如:Hashtableh=newHashtable();h.Add(1001,李天军李天军);h.Add(1002,张凯张凯);174.哈希表哈希表Hashtable哈希表又称散列表,表示哈希表又称散列表,表示键键/值对值对“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。5.字符串字典字符串字典StringDictionaryl字符串字典字符串字典StringDictionary是一种把键和值强类型化为是一种把键和值强类型化为字符串而不是对象的哈希表。其中,键不能为字符串而不是对象的哈希表。其中,键不能为null,且不,且不区分大小写。区分大小写。l例如:例如:StringDictionarymyCol=newStringDictionary();myCol.Add(姓名姓名,罗福强罗福强);myCol.Add(性别性别,男男);foreach(DictionaryEntrydeinmyCol)Console.WriteLine(0t1n,de.Key,de.Value);185.字符串字典字符串字典StringDictionary字符串字典字符串字典S6.2索引器索引器l6.2.1索引器的定义与使用索引器的定义与使用l6.2.2索引器与属性的比较索引器与属性的比较返回返回6.2索引器索引器6.2.1索引器的定索引器的定义义与使用与使用返回返回196.2.1索引器的定义与使用索引器的定义与使用l1索引器的定义索引器的定义lC#中的类成员可以是任意类型,包括数组或集合。当一个中的类成员可以是任意类型,包括数组或集合。当一个类包含了数组或集合成员时,索引器将大大简化对数组或类包含了数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作。集合成员的存取操作。6.2.1索引器的定索引器的定义义与使用与使用1索引器的定索引器的定义义206.2.1索引器的定义与使用索引器的定义与使用l定义索引器的方式与定义属性有些类似,其一般形式如下定义索引器的方式与定义属性有些类似,其一般形式如下修饰符修饰符数据类型数据类型this索引类型索引类型indexget/获得属性获得属性set/设置属性设置属性classAlbum/定义一个相册类定义一个相册类Photophotos;/该数组用于存放照片该数组用于存放照片publicPhotothisintindex/带有带有int参数的参数的Photo读读/写索引器写索引器getif(index=photos.Length)returnnull;returnphotosindex;/对于有效索引,返回请求的照片对于有效索引,返回请求的照片setif(index=photos.Length)return;photosindex=value;6.2.1索引器的定索引器的定义义与使用定与使用定义义索引器的方式与定索引器的方式与定义义属性有属性有216.2.1索引器的定义与使用索引器的定义与使用l2索引器的使用索引器的使用l通过索引器可以存取类的实例的数组成员,操作方法与数通过索引器可以存取类的实例的数组成员,操作方法与数组相似,一般形式如下:组相似,一般形式如下:对象名对象名索引索引l其中,索引的数据类型必须与索引器的索引类型相同。其中,索引的数据类型必须与索引器的索引类型相同。l【实例实例6-3】利用前面定义的索引器进行照片的添加和查询利用前面定义的索引器进行照片的添加和查询6.2.1索引器的定索引器的定义义与使用与使用2索引器的使用索引器的使用226.2.1索引器的定义与使用索引器的定义与使用l3接口中的索引器接口中的索引器l在接口中也可以声明索引器,接口索引器与类索引器的区在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器器只包含访问器get或或set,没有实现语句。访问器的用途,没有实现语句。访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器的,访问器get和和set均不能省略;如果是只读的,省略均不能省略;如果是只读的,省略set访问器;如果是只写的,省略访问器;如果是只写的,省略get访问器。访问器。例如:例如:publicinterfaceIAddressstringthisintindexget;set;/声明索引器声明索引器stringAddressget;set;/声明属性声明属性stringAnswer();/声明方法声明方法6.2.1索引器的定索引器的定义义与使用与使用3接口中的索引器接口中的索引器236.2.2索引器与属性的比较索引器与属性的比较l索引器与属性都是类的成员,语法上非常类似。索索引器与属性都是类的成员,语法上非常类似。索引器一般用在自定义的集合类中,通过使用索引器引器一般用在自定义的集合类中,通过使用索引器来操作集合对象就如同使用数组一样简单;而属性来操作集合对象就如同使用数组一样简单;而属性可用于任何自定义类,它增强了类的字段成员的灵可用于任何自定义类,它增强了类的字段成员的灵活性。活性。6.2.2索引器与属性的比索引器与属性的比较较索引器与属性都是索引器与属性都是类类的成的成员员,语语法法246.3泛型泛型l6.3.1泛型概述泛型概述l6.3.2泛型集合泛型集合l6.3.3泛型类、泛型方法和泛型接口泛型类、泛型方法和泛型接口返回返回6.3泛型泛型6.3.1泛型概述返回泛型概述返回25“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。1.什么是泛型什么是泛型l泛型是通过泛型是通过“参数化类型参数化类型”来实现在同一则来实现在同一则代码中操作多种数据类型。代码中操作多种数据类型。l泛型类型是一种编程范式,它利用泛型类型是一种编程范式,它利用“参数化参数化类型类型”将类抽象化,从而实现更为灵活的复将类抽象化,从而实现更为灵活的复用。用。l泛型赋予了代码更强的安全性、更好的复用、泛型赋予了代码更强的安全性、更好的复用、更高的效率和更清晰的约束更高的效率和更清晰的约束261.什么是泛型泛型是通什么是泛型泛型是通过过“参数化参数化类类型型”来来实现实现在同一在同一则则代代码码中中“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。6.3.泛型方法的例子泛型方法的例子voidSwap(refTt1,refTt2)Ttemp=t1;t1=t2;t2=temp;IntMax(refintt1,refintt2)inttemp=t1;t1=t2;t2=temp;inta=3,b=5;Swap(refa,refb);stringa=“12”,b=“xy”;Swap(refa,refb);inta=3,b=5;Swap(refa,refb);6.3.泛型方法的例子泛型方法的例子voidSwap(ref27“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。2.为什么要引入泛型为什么要引入泛型l通常在讨论数组时都需要预设一个前提,即到底要解决的是整数、通常在讨论数组时都需要预设一个前提,即到底要解决的是整数、小数、还是字符串的运算问题。因此,在使用数组时需要首先确定小数、还是字符串的运算问题。因此,在使用数组时需要首先确定数组的类型,然后再把相同类型的数据放入数组中。例如,把数组的类型,然后再把相同类型的数据放入数组中。例如,把100个整数存入数组中,得到一个整型数组,而把个整数存入数组中,得到一个整型数组,而把100个自定义的个自定义的Student对象存入数组中,得到一个对象型或对象存入数组中,得到一个对象型或Student型数组。型数组。l利用数组来管理数据,虽然直观、容易理解,但存在很大的局限性,利用数组来管理数据,虽然直观、容易理解,但存在很大的局限性,仍然需要重复编写几乎完全相同的代码来完成排序和查找操作。为仍然需要重复编写几乎完全相同的代码来完成排序和查找操作。为此,此,C#提供了一种更加抽象的数据类型提供了一种更加抽象的数据类型泛型,以克服数组的不足。泛型,以克服数组的不足。当利用泛型来声明这样一个更抽象的数据类型之后,再也不需要针当利用泛型来声明这样一个更抽象的数据类型之后,再也不需要针对诸如整数、小数、字符、字符串等数据重复编写几乎完全相同的对诸如整数、小数、字符、字符串等数据重复编写几乎完全相同的代码。代码。l具体思路如下:首先声明这种泛型数据类型,声明时不用指定要处具体思路如下:首先声明这种泛型数据类型,声明时不用指定要处理的数据的类型,只讨论抽象的数据操作,如排序、查找等。在实理的数据的类型,只讨论抽象的数据操作,如排序、查找等。在实际引用这种泛型数据类型时,先确定要处理的数据类型,再执行相际引用这种泛型数据类型时,先确定要处理的数据类型,再执行相应的操作。因此,泛型是一种应的操作。因此,泛型是一种“泛泛而谈泛泛而谈”的数据类型。的数据类型。282.为为什么要引入泛型通常在什么要引入泛型通常在讨论讨论数数组时组时都需要都需要预设预设一个前提,即一个前提,即6.3.3泛型类、泛型方法和泛型接口泛型类、泛型方法和泛型接口l1泛型类泛型类l当一个类的操作不针对特定或具体的数据类型时,可把这当一个类的操作不针对特定或具体的数据类型时,可把这个类声明为泛型类。泛型类最常用于集合,如链接列表、个类声明为泛型类。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列和树等。一般情况下,创建泛型类的哈希表、堆栈、队列和树等。一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,一直达到通用化和可用性的最佳平衡。为类型参数,一直达到通用化和可用性的最佳平衡。l定义泛型类的一般形式如下:定义泛型类的一般形式如下:访问修饰符访问修饰符class泛型类名泛型类名:基类或接基类或接口口类型参数约束类型参数约束/类的成员类的成员6.3.3泛型泛型类类、泛型方法和泛型接口、泛型方法和泛型接口1泛型泛型类类296.3.3泛型类、泛型方法和泛型接口泛型类、泛型方法和泛型接口l其中,其中,“访问修饰符访问修饰符”包括包括public、protected和和internal等,等,“类型参数列表类型参数列表”不指定数据类型,不指定数据类型,当具有多个类型参数时使用逗号分隔。泛型类可以当具有多个类型参数时使用逗号分隔。泛型类可以从基泛型类派生,也可以从泛型接口派生,当所声从基泛型类派生,也可以从泛型接口派生,当所声明的泛型类不是派生类时,省略基类和接口。明的泛型类不是派生类时,省略基类和接口。“类类型参数约束型参数约束”用来限定泛型类所要处理的数据类型。用来限定泛型类所要处理的数据类型。6.3.3泛型泛型类类、泛型方法和泛型接口其中,、泛型方法和泛型接口其中,“访问访问修修饰饰符符”包包306.3.3泛型类泛型类l在在C#中,一共有中,一共有5类约束,分别如下:类约束,分别如下:l(1)whereT:struct:类型参数必须是值类型。:类型参数必须是值类型。l(2)whereT:class:类型参数必须是引用类型,包括任何:类型参数必须是引用类型,包括任何类、接口、委托或数组类型类、接口、委托或数组类型l(3)whereT:new():类型参数必须具有无参数的公共构:类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,造函数。当与其他约束一起使用时,new()约束必须最后约束必须最后指定。指定。l(4)whereT::类型参数必须是指定:类型参数必须是指定的基类或派生自指定的基类。的基类或派生自指定的基类。l(5)whereT::类型参数必须是指定的:类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。口也可以是泛型的。6.3.3泛型泛型类类在在C#中,一共有中,一共有5类约类约束,分束,分别别如下:如下:316.3.3泛型类泛型类l【实例实例6-4】泛型类的定义和使用演示。泛型类的定义和使用演示。6.3.3泛型泛型类类【实实例例6-4】泛型】泛型类类的定的定义义和使用演示。和使用演示。326.3.3泛型方法泛型方法l2泛型方法泛型方法l泛型方法是在泛型类或泛型接口中使用类型参数声明的方泛型方法是在泛型类或泛型接口中使用类型参数声明的方法。其一般形式如下:法。其一般形式如下:访问修饰符访问修饰符返回值类型返回值类型方法名方法名(形式参形式参数列表数列表)/语句语句l其中,类型参数列表与其所属的泛型类的类型参数列表相其中,类型参数列表与其所属的泛型类的类型参数列表相同。同。6.3.3泛型方法泛型方法2泛型方法泛型方法33“雪亮工程雪亮工程是以区(是以区(县县)、)、乡乡(镇镇)、村(社区)三)、村(社区)三级综级综治中心治中心为为指指挥挥平台、以平台、以综综治信息化治信息化为为支撑、以网格化管理支撑、以网格化管理为为基基础础、以公共安全、以公共安全视频监视频监控控联联网网应应用用为为重点的重点的“群众性治安防控工程群众性治安防控工程”。6.3.泛型方法泛型方法TMax(Tt1,Tt2)if(t1t2)returnt1;returnt2;intMax(intt1,intt2)if(t1t2)returnt1;returnt2;inta=3,b=5;?Max(a,b);stringa=“12”,b=“xy”;?Max(a,b);inta=3,b=5;?Max(a,b);Comparable(T,T)?operator6.3.泛型方法泛型方法TMax(Tt1,T346.3.3泛型接口泛型接口lC#允许自定义泛型接口,一般形式如下:允许自定义泛型接口,一般形式如下:访问修饰符访问修饰符interface接口名接口名/接口成员接口成员l其中,访问修饰符可省略,其中,访问修饰符可省略,“类型参数列表类型参数列表”表示尚未确表示尚未确定的数据类型,类似于方法中的形参列表,当具有多个类定的数据类型,类似于方法中的形参列表,当具有多个类型参数时使用逗号分隔,泛型接口也可以使用类型约束。型参数时使用逗号分隔,泛型接口也可以使用类型约束。publicinterfaceIComparableintCompareTo(Tt);publicinterfaceIComparerintCompare(Tt1,Tt2);6.3.3泛型接口泛型接口C#允允许许自定自定义义泛型接口,一般形式如下:泛型接口,一般形式如下:p352024/5/736publicclassmyCompare:IcomparerintCompare(Tt1,Tt2)/不区分大小写的比不区分大小写的比较器器return(newCaseInsensitiveComparer().Compare(t1,t2);TMax(Tt1,Tt2)Tmax;if(Compare(t1,t2)0)max=t1;elsemax=t2;returnmax;2023/8/136publicclassmyCompa362024/5/737ClassOverThankyou!2023/8/137ClassOverThankyou!37
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!