泛型介绍

值类型转换为引用类型 是装箱 ,存在堆上
引用类型转换为值类型 是拆箱 ,存在栈上

泛型用一个数据类型 T 来代替object,在类实例化时指定T的类型,运行时(Runtime)自动编译为本地代码,运行效率和代码质量都有很大提高,
并且保证数据类型安全。

public class Stack<T>

    {

        private T[] m_item;

        public T Pop(){...}

        public void Push(T item){...}

        public Stack(int i)

        {

            this.m_item = new T[i];

        }

}

实例化:

  Stack<int> a = new Stack<int>(100);

      a.Push(10);

      a.Push("8888"); //这一行编译不通过,因为类a只接收int类型的数据

      int x = a.Pop();

 

1. 他是类型安全的。实例化了int类型的栈,就不能处理string类型的数据,其他数据类型也一样。

2. 无需装箱和折箱。这个类在实例化时,按照所传入的数据类型生成本地代码,本地代码数据类型已确定,所以无需装箱和折箱。

3. 无需类型转换。

 

 

C#中数据类型有两大类:引用类型和值类型。引用类型如所有的类,值类型一般是语言的最基本类型,如int, long, struct等,在泛型的约束中,我们也可以大范围地限制类型T必须是引用类型或必须是值类型,分别对应的关键字是class和struct:

public class Node<T, V> where T : class

        where V: struct

 

 

泛型本质上是在编译器编译代码之前,编译器所做的一种预处理操作。
所谓预处理操作,你可以类比以下宏命令的#define。
比如你写了一个泛型类
class a<T>
{
T a;
}
而class a<T>并不是一个真正的类,甚至都不会被编译到中间代码中。
但你一旦在某处使用了诸如
class a<int> s=new class a<int>();
编译器就会在你实际的代码上加入
class a<int>
{
int a;
}
这时class a<int>才是一个类,你可以把 a<int>看做类名
所以泛型就是一个替换的作用,但是不是#define那种硬生生的替换
在替换之前还要做很多诸如检查约束的事情。




//简单的泛型例子,泛型方法示例
namespace FanXin
{
class Program
{
static void Main(string[] args)
{

int[] col = new int[] { 1, 2, 3, 4, 5 };
int b =6;
//调用泛型方法
Console.WriteLine(Fan.Find<int>(col, b));
Console.WriteLine(Fan.Find<string>(new string[] { "a", "b", "c", "d", "e" }, "c"));
Console.WriteLine(Fan.Find<char>(new char[]{'a','b','c','d','y','m','h','s'},'d'));
Console.ReadLine();
}
}
public class Fan
{//非泛型类
public static int Find<T>(T[] items,T item)
{//泛型方法,如果查找到数据则返回位置,否则返回-1
for(int index=0;index<items.Length;index++)
{
if (items[index].Equals(item)) { return index; }
}
return -1;
}
}
}
posted @ 2014-07-24 15:51  裸奔的豆子  阅读(157)  评论(0编辑  收藏  举报