泛型(一)

泛型并不是一个全新的结构,其他语言中有类似的概念。例如,C++模板就与泛型相似。但是,
c++模板和.NET泛型之间有一个很大的区别。对于C++模板只在用特定的类型实例化模板时,需要模
板的源代码。相反,泛型不仅是C#语言的一种结构,而且是CLR定义的。所以,即使泛型类是在唧
中定义的,也可以在Ⅵsual Basic中用一个特定的类型实例化该泛型。
创建链表的泛型版本。泛型类的定义与一般类类似,只是要使用泛型类型声明。之后,泛
型类型就可以在类中用作一个字段成员,或者方法的参数类型。LinkedListNode类用一个泛型类型
T声明。属性Value的类型是T,而不是object。构造函数也变为可以接受T类型的对象。也可以返
回和设置泛型类型,所以属性Next和Prev的类型是LinkedListNode<T>。
public class LinkedListNode(T>
{
pub1ic LinkedListNode(T value)
{
this.Value = value;
}
public T Value {get;private set; }
pub1ic LinkedListNode(T) Next { get;internal set; )
public LinkedListNode<T) PreV { get; internal set; )
}
下面的代码把LinkedList类也改为泛型类。LinkedList<T>包含LinkedListNode<T>元素。
LinkedList中的类型T定义了类型T的属性first和last。AddLast()方法现在接受类型T的参数,并
实例化LinkedListNode<T>的对象。
除了IEnunmble接口,还有一个泛型版本IEnunmble<T>。IEnumeralbe<T>派生自IEnumerable ,添加了返回IEnunmtor<T>,的GetEnmnmtor()方法,LinkedList<T>实现泛型接口IEnunemble<T>。
public Class LinkedList<T> : IEnumerable<T>
{
pub1iC LinkedListNode<T> First { get; private set;}
public LinkedListNode<T> Last {get; private set;}
pub1ic LinkedListNode<T> AddLast(T node)
{
var newNode = new LinkedListNode(node);
if (First == null)
{
First = newNode'
newNode.Prev = Last;
Last = First;
}
else
{
LinkListNode previous = Last;
Last.Next = newNode;
Last = newNode;
Last.Prev = previous;
}
return newNode;
public IEnumerator<T> GetEnumerator()
{
LinkedListNode(T> Current = First;
while (current != null )
{
yield return current.Value;
current = current.Next;
}
}
IEnumerator IEnumerab1e.GetEnumerator()
{
return GetEnumerator();
}
}
使用泛型类LinkedList<T>,可以用int类型实例化它,且无需装箱操作。如果不使用AddLast()方法传递int,就会出现一个编译错误。
泛型类的功能
默认值
不能把null赋予泛型类型。原因是泛型类型也可以实例化为值类型,而null只能用
于引用类型。为了解决这个问题,可以使用default关键字。通过default关键字,将null赋予引用类型,将0赋予值类型。
约束


继承
泛型类型可以实现泛型接口,也可以派生自一个类。泛型类可以派生自泛型基类
public class Base<T>
{}
public class Derived<T> : Base<T>
{}
其要求是必须重复的泛型类型,或者必须指定基类的类型,如下例所示:
public class Base<T>
{}
pub1ic class Derived<T> : Base<string>
{}

原文地址:https://www.cnblogs.com/miffylf/p/4006808.html