预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

详解C#泛型特性及相关实例 在这里我们将讨论的是C#泛型特性及相关实例,希望通过本文如此详细的介绍,能对大家了解泛型有所帮助。 本文将为大家讲述.NET中最常见的一种特性,C#泛型。希望通过本文能帮助大家更好的学习和理解C#泛型,在平时的开发工作中起到事半功倍的效果。 HYPERLINK"http://developer.51cto.com/art/200908/147163.htm"\t"_blank"C#泛型问题简介和陈述 HYPERLINK"http://developer.51cto.com/art/200908/147769.htm"\t"_blank"详述C#泛型集合相关内容 HYPERLINK"http://developer.51cto.com/art/200909/148766.htm"\t"_blank"深度剖析C#泛型的使用 HYPERLINK"http://developer.51cto.com/art/200909/148801.htm"\t"_blank"关于C#泛型作用的简单说明 HYPERLINK"http://developer.51cto.com/art/200909/149170.htm"\t"_blank"C#泛型支持简单描述 泛型,.NET的这个特性相信大家都已经很熟悉了,提起泛型,不能不首先提到C++中的模板,C++中模板的引入大大提高了代码的重用性,因此也得到了许多程序员的喜爱。因此,在同为强类型语言平台的.NET2.0和Java1.5中,它们也都不约而同的引入了泛型的对语言和平台的支持。不过虽然三种语言最终都提供了将类型参数化的功能,然而这个功能在三个平台或语言中的实现却大大不同。相对来说,C++的模板功能是三者中最为强大的,不过由于.Net和Java对类型安全和稳定性要求更高,它们对泛型的支持要稍微简单,不过即使如此,二者对泛型特性的实现也引起了两个阵营中程序员们的争论,不过最终普遍认为Java的伪泛型(擦拭法)要比.NET的JIT级别的真正的泛型性能要差(java仍然有装箱,拆箱操作)。当然这些是后话,下面我们来看看.NET的泛型到底如何使用吧! 基本介绍 .NET2.0以后以后支持在很多类型上使用泛型,包括类、结构、接口、委托和方法成员,在这些类型上使用泛型和在类上使用是一样的。它甚至支持同一个接口但不同泛型类型的实现,这有点类似重载在类级别的实现。最后.NET允许你同时定义多个泛型类型。 在泛型方法中的泛型类型基本跟在类中使用情况一样,不过泛型方法有一个方便程序员的地方就是它的类型推断功能,这意味着程序员可以即能和使用普通方法一样使用这些方法,同时又能享受泛型带来的方便。e.g. 代码 staticvoidTest<T,U>(Tt,Uu){}staticvoidmain(){ //在函数中我们可以不用声明参数类型,编译器会自动根据实际数据 //自动推断类型 Test(10,"20");Test(1.1,2.2);} 下面我们来看看泛型在.NET中使用的一些需要注意的地方。 1.泛型在嵌套类中的使用。嵌套的子类会自动继承(?)包裹类的泛型类型,当然,你也可以在嵌套类中覆盖掉包裹类的类型,不过编译器会在编译的时候发出警告来提醒用户注意避免误写。e.g. classContainer<T,U>{ //编译器会在这里发出警告 //告诉用户这里的泛型和包裹类相同 classNested<U>{voidMethod(Tp0,Up1){}}} 2.协变和逆变的问题。关于协变和逆变的定义简单来说就是泛型类型是否允许子类和父类之间转换,这里不做详细讨论,读者如果有兴趣可以参考这篇文章。在.net4.0以前是不支持协变和逆变的,这也让我们的代码有些时候实现起来很别扭。下面可以看个简单的例子(注:这个例子仅作说明用,不一定恰当)。 首先我们定义两个数据类型,IData和IOperation: interfaceIData{voidmethod();} interfaceIOperation<T> whereT:IData{voidRun(Tdata);} 然后我们分别定义不同类型的数据和操作类: 代码 classAddData:IData{publicintA1,A2; publicvoidmethod(){}}classAdd:IOperation<AddData> {publicvoidRun(AddDatad) {Console.WriteLine(d.A1+d.A2);}} classComplexData:IData{publicvoidmethod(){} publicintA1,A2,B1,B2;} classComplexAdd:IOperati