using System;
using System.Collections.Generic;
using System.Text;
namespace example
{
class GenericClass<T>
{
public void PrintType(T t)
{
Console.WriteLine("Value:{0} Type:{1}",t,t.GetType());
}
}
class Program
{
static void Main(string[] args)
{
int i = 0;
GenericClass<int> gci = new GenericClass<int>();
gci.PrintType(i);
string s = "hello";
GenericClass<string> gcs = new GenericClass<string>();
gcs.PrintType(s);
Console.ReadLine();
}
}
}
泛型方法可以出现在泛型或非泛型类型上。需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。在下面的代码中,只有方法 G 是泛型方法。
class A
{
T G<T>(T arg) {...}
}
class Generic<T>
{
T M(T arg) {...}
}
泛型的Where
泛型的Where能够对类型参数作出限定。有以下几种方式。
·where T : struct 限制类型参数T必须继承自System.ValueType。
·where T : class 限制类型参数T必须是引用类型,也就是不能继承自System.ValueType。
·where T : new() 限制类型参数T必须有一个缺省的构造函数
·where T : NameOfClass 限制类型参数T必须继承自某个类或实现某个接口。
以上这些限定可以组合使用,比如: public class Point where T : class, IComparable, new()
定义:
public class GenericList<T>
{
public void Add(T input)//T制定成类型参数
public T Add()//T制定成返回值
}
<T>的T是类型参数,起占位符的作用,编译时被真正类型取代。
使用泛型:
GenericList<int> list1 = new GenericList<int>();
GenericList<string> list2 = new GenericList<string>();
GenericList<类名> list3 = new GenericList<类名>();
GenericList<类名<int>> list4= new GenericList<类名<int>>();
以list1为例编译器生成以下的方法:
public void Add(int input)
public int Add()
有多个类型参数的泛型类:
public class 类名<T,U>
泛型约束:
确保泛型类使用的参数是提供特定方法的类型。
public class GenericList<T> where T : IEmployee
假如IEmployee接口包含A方法,编译器会验证用于替换T的类型一定要实现IEmployee接口。
泛型方法:允许采取定义泛型类时采用的方式
//定义泛型方法
static void Swap<T>(ref T lhs, ref T rhs)
//T是类型参数
public class GenericList<T>
{
//嵌套类,表示节点类
class Node
{
Node next;//表示下一个节点
T data;//表示当前节点存储的数据(T类型)
public Node Next
{
get { return next; }
set { next = value; }
}
public T Data
{
get { return data; }
set { data = value; }
}
//构造函数
public Node(T t)
{
next = null;
data = t;
}
}
Node head;//GenericList<T>类的字段,表示头节点
public GenericList()
{
head = null;
}
//为GenericList添加节点的方法,t是数据
public void AddHead(T t)
{
Node n = new Node(t);//首先把数据t保存在节点类型中
n.Next = head;//当前存了数据的节点的下一个节点的值变为当前list对象的head
head = n;//把n存为头节点
//即向前添加的,把一个节点插入到list中的头部,后面的数据依次往后排
}
public IEnumerator<T> GetEnumerator()//IEnumerator<T>为泛型集合提供迭代功能的接口
{
Node current = head;//当前节点
while (current!=null)//当前节点不为空,则迭代返回其数据,并且跳到下一个节点
{
yield return current.Data;
current = current.Next;
}
}
}
public class Program
{
static void Main(string[] args)
{
GenericList<int> list = new GenericList<int>();
for (int i = 0; i < 10; i++)
{
list.AddHead(i);
}
foreach (int data in list)//可以用foreach是因为GenericList实现了IEnumerator<T>
{
Console.Write(data+" ");
}
Console.ReadKey();
}
} 作者: 李小熊 时间: 2013-10-21 14:32
泛型
所谓泛型,就是创建使用通用(而不是特定)类型的类或方法。