环境
系统:Windows 7
引擎:VS2013
目的
泛型类通过继承的方式,可实现同一链表中具有不同类型的元素。
实例:相同类型链表与不同类型链表的比较
(1)代码:
using System;
namespace GenericsLinkedListTest
{
class Program
{
#region 相同类型链表
internal sealed class Node<T>
{
public T m_data;
public Node<T> m_next;
public Node(T data) : this(data, null) {}
public Node(T data, Node<T> next)
{
m_data = data;
m_next = next;
}
public override string ToString()
{
return m_data.ToString() + ((m_next != null) ? m_next.ToString() : null);
}
}
private static void SameTypeLinkedList()
{
Node<String> head = new Node<String>(".");
head = new Node<String>(" You", head);
head = new Node<String>(" Love", head);
head = new Node<String>("I", head);
Console.WriteLine(head.ToString());
}
#endregion
#region 不同类型链表
internal class Node
{
protected Node m_next;
public Node(Node next)
{
m_next = next;
}
}
internal sealed class TypeNode<T> : Node
{
public T m_data;
public TypeNode(T data) : this(data, null) {}
public TypeNode(T data, Node next)
: base(next)
{
m_data = data;
}
public override string ToString()
{
return m_data.ToString() + (m_next != null ? m_next.ToString() : null);
}
}
private static void DifferentTypeLinkedList()
{
Node head = new TypeNode<Char>('.');
head = new TypeNode<DateTime>(DateTime.Now, head);
head = new TypeNode<String>(" at ", head);
head = new TypeNode<String>(" You", head);
head = new TypeNode<String>(" Love", head);
head = new TypeNode<Char>('I', head);
Console.WriteLine(head.ToString());
}
#endregion
static void Main(string[] args)
{
SameTypeLinkedList();
DifferentTypeLinkedList();
}
}
}
(2)结果:
I Love You.
I Love You at 2019/5/23 12:10:11.
用了不同类型链表,除了可以表达爱意,还是具有实时性的爱意哦。
问题
泛型类生成多一种实际类型时,会编译多一份这种实际类型的代码,导致代码爆炸。
解决
泛型类型参数进行JIT编译时,引用类型实参使用相同IL代码,而值类型实参在同一AppDomain中对相同值类型只编译一次,以上是泛型类型缓解代码爆炸的方法。
以上简单回顾。
参考资料:
《CLR via C#(第3版)》第12.3节