为了提高应用程序的效率和可用性,C#2.0引入了泛型概念.C#泛型有些类似C++的摸版。
(一)特点
泛型具有以下功能特点:
一、使用泛型可以定义类型安全的数据结构,而无需使用实际的数据类型。
二、通过使用泛型,能够将数据类型参数化,以此完成代码重用的目标。这一参数可以应用在类、方法、结构、接口、委托等设计中。
三、泛型可提供编译期间的类型检查,减少不必要的显式类型转换,减少不必要的装箱操作,从而提高应用程序的运行效率。
(二)泛型集合
泛型常用于集合应用中。在.NET2.0框架的类库中,提供了一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型的容器类,例如:System.Collections.Generic.Stack、System.Collections.Generic.Dictionary、System.Collections.Generic.List、System.Collections.Generic.Queue等,这些类库可以在集合中实现泛型。
下面是一个Stack类具体的应用代码:
//实列化Stack类
System.Collections.Generic.Stack<string> stringStack=new System.Collections.Generic.Stack<string>();
//添加数据
stringStack.Push("常德");
stringStack.Push("北京");
stringStack.Push("武汉");
//转换为数组
Array stringArray;
stringArray=stringStack.ToArray();
//显示数组
foreach(string s in stringArray)
{
Response.Write(s);
}
以上代码中,首先实例化了一个Stack类的stringStack,并且设置其参数是string,这说明该类所实现堆栈的数据类型是string。然后,通过Stack类的Push方法压入3个字符串数据,并且使用ToArray方法,将堆栈中的数据转换到一个数组stringArray中(此时,stringArray是一个字符串数组)。最后,使用Response.Write( )方法将数组中的数据显示出来(逆序显示,这是堆栈的特性)。
另外,如果要求堆栈中存储的是int类型,那么可以使用同样的方法,只需要修改很少的内容即可实现。
(三)泛型方法
在某些情况下,一个类型参数并不为整个类所必需,而只用于一个特定的方法中。这个情况竟法发上在建立一个需要泛型作为参数的方法时。
一个泛型方法有一个或多个类型参数,并且在方法名后面由“<”和“>”限定符指定。这个类型参数可以用在参数利表、返回值和方法体中。
public void StackPush<T>(Stack<T> stack, params T[] values)
{
foreach (T value in values)
{
stack.Push(value);
}
}
使用这个方法,可以将多个元素压入任何Stack<T>中。当调用一个泛型方法时,要在函数的调用中将类型参数放入尖括号中。示例代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Stack<int> stack = new Stack<int>();
StackPush<int>(stack, 1, 2, 3, 4);
在上面的例子中,由于第一个正式参数类型是Stack<int>,并且后面的参数类型都是int,编译器可以推断类型参数一定是int,因此在调用泛型的StackPush方法时可以不用提供类型参数。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Stack<int> stack = new Stack<int>();
StackPush(stack, 1, 2, 3, 4);
(一)特点
泛型具有以下功能特点:
一、使用泛型可以定义类型安全的数据结构,而无需使用实际的数据类型。
二、通过使用泛型,能够将数据类型参数化,以此完成代码重用的目标。这一参数可以应用在类、方法、结构、接口、委托等设计中。
三、泛型可提供编译期间的类型检查,减少不必要的显式类型转换,减少不必要的装箱操作,从而提高应用程序的运行效率。
(二)泛型集合
泛型常用于集合应用中。在.NET2.0框架的类库中,提供了一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型的容器类,例如:System.Collections.Generic.Stack、System.Collections.Generic.Dictionary、System.Collections.Generic.List、System.Collections.Generic.Queue等,这些类库可以在集合中实现泛型。
下面是一个Stack类具体的应用代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
另外,如果要求堆栈中存储的是int类型,那么可以使用同样的方法,只需要修改很少的内容即可实现。
(三)泛型方法
在某些情况下,一个类型参数并不为整个类所必需,而只用于一个特定的方法中。这个情况竟法发上在建立一个需要泛型作为参数的方法时。
一个泛型方法有一个或多个类型参数,并且在方法名后面由“<”和“>”限定符指定。这个类型参数可以用在参数利表、返回值和方法体中。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)