一、泛型的优点
泛型是C#中相当重要的一部分,泛型有如下几个突出的有点:
1、性能。泛型的主要的一个优点就是性能,在实际项目中经常会遇到装箱和拆箱,尤其是在遍历的时候,频繁的装箱和拆箱会造成很大的性能损失,而泛型在泛型定义的时候就需要指定数据类型,在JIT编译器动态生成的类型中不再需要装箱和拆箱,如定义List<int>
2、类型安全。在泛型类中泛型类型T定义了允许使用的类型,如List<int>就只允许添加int类型,否则编译器就编译不过。
3、二进制代码的重用。泛型类定义一次,就可以有许多不同的类型实例化。
二、命名规范
1、泛型类型的名称以T作为前缀,如TKey
2、假如泛型类型允许用任意类代替,且使用一个泛型类型,就是有T作为泛型类型的名称,如List<T>
3、如果泛型类必须实现一个接口或者派生自基类或者使用了多个泛型类型,就以T为前缀加上描述性的名称,如TEventArgs。
三、创建泛型链表
我们知道链表可能是int类型,也可能是string类型或者其他更多的类型,但是链表的结构与功能确实一样,如int类型的链表和string类型的链表除了数据类型不一样,其余的一模一样,假如分别实现两份代码,就会很冗余。所以下面以建立一个泛型链表来简单介绍泛型的使用。
1、建立泛型节点类
链表可以简单理解为一个具有相同数据类型的数据的集合,类似的还有队列,数组等。链表的特点是除了第一个和最后一个节点之外的节点都有前节点和后节点,即可以通过任意一个节点可以推算出所有的节点。由此,定义如下节点的泛型版本,代码如下:
public class LinkedNode<T>
{
public LinkedNode(T value)
{
this.Value = value;
}
public T Value { get; private set; }
public LinkedNode<T> Next { get; internal set; }
public LinkedNode<T> Prev { get; internal set; }
}
定义这样泛型类型的节点,就可以实例化成任意数据类型的节点。
2、创建泛型链表类
链表是一个具有相同类型的节点的集合,并且具有添加节点的功能,正如上文所述,链表的第一个节点和最后一个节点比较特殊,第一个节点没有前节点,最后一个节点没有后节点,每次新增节点都是更新最后一个节点,另外在链表使用过程中需要迭代所有的节点,假如根据第一个节点逐个取出节点将会增加许多额外的工作,所以链表应该继承自IEnumerable接口,这个接口也有泛型版本IEnumerable<T>,由此泛型链表类代码如下:
public class LinkedList<T> : IEnumerable<T>
{
public LinkedNode<T> Frist { get; private set; }
public LinkedNode<T> Last { get; private set; }
public LinkedNode<T> AddNode(T node)
{
var newNode = new LinkedNode<T>(node);
if (Frist==null)
{
Frist = newNode;
Last = Frist;
}
else
{
LinkedNode<T> prev = Last;
Last.Next = newNode;//这里需要注意,得先更新Last的Next节点,再更新Last节点,因为Last为添加节点的上一个节点,所以Last的Next是新节点
Last = newNode;
Last.Prev = prev;
}
return newNode;
}
public IEnumerator<T> GetEnumerator()
{
LinkedNode<T> current = Frist;
while (current!=null)
{
yield return current.Value;
current = current.Next;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
以上就实现了一个可以示例化成任意类型的链表。
3、链表的使用
将以上实现的链表示例化成int类型的链表,在控制台程序中可如下测试:
static void Main(string[] args)
{
LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddNode(1);
linkedList.AddNode(3);
linkedList.AddNode(5);
linkedList.AddNode(7);
foreach (int item in linkedList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
运行结果如图:
以上就简单介绍泛型的基本用法和C#中泛型链表的实现。