简单理解:一种类型占位符,或称之为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是——类型安全和减少装箱、拆箱。
泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。
关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。下边的这段代码是泛型的一个最简单的应用
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
*//string 类型和int类型都实现了IComparable接口
CompareIt<int> com = new CompareIt<int>();
int i = 5;
int j = 10;
com.Max(i, j);
int iResult = com.Max(i, j);
Console.WriteLine("The Max of {0} and {1} is: {2}", i, j, iResult);
CompareIt<string > compare3=new CompareIt<string>();
string s1="Lesson 1";
string s2="Lesson 2";
string d=compare3.Max(s1, s2);
Console.WriteLine("The Max of {0} and {1} is: {2}", s1, s2 , d);
}
}
class CompareIt<ItemType> where ItemType : IComparable//where 是一个限制条件语句,规定了传进来的参数类型要实现了IComparable接口
{
public ItemType Max(ItemType item1, ItemType item2)
{
int iResult = item1.CompareTo(item2);
if (iResult > 0)// item 1 is greater than item2
{
return item1;
}
else if (iResult < 0)// item2 is greater than item1
{
return item2;
}
return item2;
}
}
}
泛型的机制
·机制:
C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以"on-demand"的方式,发生在JIT编译时。
·编译机制:
1. 第一轮编译时,编译器只为Stack<T>(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符
2. JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。
泛型的一些问题
·不支持操作符重载。我只知道这么多了
范型的意义
泛型的意义何在?类型安全和减少装箱、拆箱并不是泛型的意义,而是泛型带来的两个好处而已(或许在.net泛型中,这是最明显的好处了)。泛型的意义在于——把类型作为参数,它实现了代码之间的很好的横向联系,我们知道继承为代码提供了一种从上往下的纵向联系,但泛型提供了方便的横向联系(从某种程度上说,它和AOP在思想上有相通之处)。在PersonCollection例子中,我们知道Add()方法和Remove()方法的参数类型相同,但我们明确无法告诉我们的程序这一点,泛型提供了一种机制,让程序知道这些。道理虽然简单,但这样的机制或许能给我们的程序带来一些深远的变化吧。