一、定义
public class Stack<T>
{
T[] m_Items;
public void Push(T item){... }
public T Pop(){...}
public Stack(){...}
}
二、使用
Stact<int> stack = new Stack()<int>();
stack.Push(1);
stack.Push(2);
//stack.Pust("sss");会出错
int number = stack.Pop();
三、好处
1、性能高
2、类型安全
3、可重用
四、在编译泛型类时只是一个占位符,在实例化时会替换为特定的类型。
五、结构体中使用泛型
public struct Point<T>
{
T x;
T y;
}
使用:
Point <int> point;
point.X =1; point.Y =1;
六、使用默认值,值类型是0,引用类型是null
T t = default(T);
七、使用多个也是可以的 public class Nodes<K,T>
另外一个使用Nodes的类LinkedList也必须使用泛型。public class LinkedList<K,T>
使用别名using List = LinkedList<int,string>;就可以使用List list = new List()进行实例化了。
八、泛型约束
1、派生约束,指定参数必须从什么类和接口派生。
比如在查找时要比较,必须有Icomparable约束。
public class Nodes<K,T> where K:IComparable,另外也可以用where K:IComparable<K>,防止装箱。
具体语法是:public class class名称<参数1,参数2,...> where 参数1:类,接口1,接口2 where 参数2:...
2、构造函数约束,表示参数必须有构造函数。
public class Nodes<K,T> where T:new()
其中Nodes中使用new T()时必须有构造函数约束。
3、引用/值约束
public class Nodes<K,T> where T:struct //值类型
public class Nodes<K,T> where T:class//引用类型
以上的约束的可以共存,但是有些不能共存。太多了,反正会出错,就不写了。
顺序是: where 参数1:引用/值约束,派生约束,构造函数约束。