Csharp/C#教程:详解C#中的泛型以及编程中使用泛型的优点分享

2.0版C#语言和公共语言运行时(CLR)中增加了泛型。泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险,如下所示:

//Declarethegenericclass. publicclassGenericList<T> { voidAdd(Tinput){} } classTestGenericList { privateclassExampleClass{} staticvoidMain() { //Declarealistoftypeint. GenericList<int>list1=newGenericList<int>(); //Declarealistoftypestring. GenericList<string>list2=newGenericList<string>(); //DeclarealistoftypeExampleClass. GenericList<ExampleClass>list3=newGenericList<ExampleClass>(); } }

泛型概述
使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。
泛型最常见的用途是创建集合类。
.NETFramework类库在System.Collections.Generic命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如System.Collections命名空间中的ArrayList。
您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
可以对泛型类进行约束以访问特定数据类型的方法。
关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用与集合以及作用于集合的方法一起使用。.NETFramework2.0版类库提供一个新的命名空间System.Collections.Generic,其中包含几个新的基于泛型的集合类。建议面向.NETFramework2.0及更高版本的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类如ArrayList。

当然,也可以创建自定义泛型类型和方法,以提供自己的通用解决方案,设计类型安全的高效模式。下面的代码示例演示一个用于演示用途的简单泛型链接列表类。(大多数情况下,应使用.NETFramework类库提供的List<T>类,而不是自行创建类。)在通常使用具体类型来指示列表中存储的项的类型的场合,可使用类型参数T。其使用方法如下:
在AddHead方法中作为方法参数的类型。
在Node嵌套类中作为公共方法GetNext和Data属性的返回类型。
在嵌套类中作为私有成员数据的类型。
注意,T可用于Node嵌套类。如果使用具体类型实例化GenericList<T>(例如,作为GenericList<int>),则所有的T都将被替换为int。

//typeparameterTinanglebrackets publicclassGenericList<T> { //ThenestedclassisalsogenericonT. privateclassNode { //Tusedinnon-genericconstructor. publicNode(Tt) { next=null; data=t; } privateNodenext; publicNodeNext { get{returnnext;} set{next=value;} } //Tasprivatememberdatatype. privateTdata; //Tasreturntypeofproperty. publicTData { get{returndata;} set{data=value;} } } privateNodehead; //constructor publicGenericList() { head=null; } //Tasmethodparametertype: publicvoidAddHead(Tt) { Noden=newNode(t); n.Next=head; head=n; } publicIEnumerator<T>GetEnumerator() { Nodecurrent=head; while(current!=null) { yieldreturncurrent.Data; current=current.Next; } } }

下面的代码示例演示客户端代码如何使用泛型GenericList<T>类来创建整数列表。只需更改类型参数,即可方便地修改下面的代码示例,创建字符串或任何其他自定义类型的列表:

classTestGenericList { staticvoidMain() { //intisthetypeargument GenericList<int>list=newGenericList<int>(); for(intx=0;x<10;x++) { list.AddHead(x); } foreach(intiinlist) { System.Console.Write(i+""); } System.Console.WriteLine("nDone"); } }

泛型的优点
在公共语言运行时和C#语言的早期版本中,通用化是通过在类型与通用基类型Object之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案。通过创建泛型类,您可以创建一个在编译时类型安全的集合。
使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序使用.NETFramework类库中的ArrayList集合类。ArrayList是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。

//The.NETFramework1.1waytocreatealist: System.Collections.ArrayListlist1=newSystem.Collections.ArrayList(); list1.Add(3); list1.Add(105); System.Collections.ArrayListlist2=newSystem.Collections.ArrayList(); list2.Add("ItisraininginRedmond."); list2.Add("Itissnowinginthemountains.");

但这种方便是需要付出代价的。添加到ArrayList中的任何引用或值类型都将隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。
另一个限制是缺少编译时类型检查;因为ArrayList会将所有项都强制转换为Object,所以在编译时无法防止客户端代码执行类似如下的操作:

System.Collections.ArrayListlist=newSystem.Collections.ArrayList(); //Addanintegertothelist. list.Add(3); //Addastringtothelist.Thiswillcompile,butmaycauseanerrorlater. list.Add("ItisraininginRedmond."); intt=0; //ThiscausesanInvalidCastExceptiontobereturned. foreach(intxinlist) { t+=x; }

尽管将字符串和ints组合在一个ArrayList中的做法在创建异类集合时是完全可接受的,并且有时需要有意为之,但这种做法很可能产生编程错误,并且直到运行时才能检测到此错误。
在C#语言的1.0和1.1版本中,只能通过编写自己的特定于类型的集合来避免.NETFramework基类库集合类中的通用代码的危险。当然,由于此类不可对多个数据类型重用,因此将丧失通用化的优点,并且您必须对要存储的每个类型重新编写该类。
ArrayList和其他相似类真正需要的是:客户端代码基于每个实例指定这些类要使用的具体数据类型的方式。这样将不再需要向上强制转换为T:System.Object,同时,也使得编译器可以进行类型检查。换句话说,ArrayList需要一个类型参数。这正是泛型所能提供的。在N:System.Collections.Generic命名空间的泛型List<T>集合中,向集合添加项的操作类似于以下形式:

//The.NETFramework2.0waytocreatealist List<int>list1=newList<int>(); //Noboxing,nocasting: list1.Add(3); //Compile-timeerror: //list1.Add("ItisraininginRedmond.");

对于客户端代码,与ArrayList相比,使用List<T>时添加的唯一语法是声明和实例化中的类型参数。虽然这种方式稍微增加了编码的复杂性,但好处是您可以创建一个比ArrayList更安全并且速度更快的列表,对于列表项是值类型的情况尤为如此。

上述就是C#学习教程:详解C#中的泛型以及编程中使用泛型的优点分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)! 您可能感兴趣的文章:深入解析C#中的泛型类与泛型接口C#泛型集合Dictionary<K,V>的使用方法C#泛型Dictionary的用法实例详解C#中Predicate<T>与Func<T,bool>泛型委托的用法实例C#泛型实例详解C#泛型和反射实例解析c#泛型序列化对象为字节数组的示例关于C#泛型列表List<T>的基本用法

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/907008.html

(0)
上一篇 2021年10月24日
下一篇 2021年10月24日

精彩推荐