c# 泛型

泛型使用一个通用的类型T 来代替OBJECT; 使用了泛型的集合可以保证其类型安全以及可以避免集合添加元素、取出元素时候的装箱、拆箱操作。

一个简单的例子:

1 泛型类

我们需要将两个值ToString()后再相加并输出到屏幕,那么我们可能会像如下这么写(可能这么简单的功能没人会像如下这么做,大概会只封装一个以string为参数的函数,在传参的时候ToString(),此处只是为了举例的方便,假设函数没那么简单的情况下):

class MyHelper
{
    public static void AddAndPrint(int i, int j)
    {
        Console.WriteLine(string.Format("The value is {0}", i.ToString() + "@" + j.ToString()));
    }
    public static void AddAndPrint(float i, float j)
    {
        Console.WriteLine(string.Format("The value is {0}", i.ToString() + "@" + j.ToString()));
    }
    public static void AddAndPrint(double i, double j)
    {
        Console.WriteLine(string.Format("The value is {0}", i.ToString() + "@" + j.ToString()));
    }
}

 请注意,上面三个AddAndPrint函数除了参数类型以外,函数体内部实现完全一样。那么我们会这样调用它们:

static void Main(string[] args)
{
    MyHelper.AddAndPrint(100, 120);
    MyHelper.AddAndPrint(100.123F, 120F);
    MyHelper.AddAndPrint(100.456D, 120.666D);
    Console.ReadKey();
}

 

 

那么很容易就可以想到,AddAndPrint函数仅仅参数类型不一样却“不得不”写了三次(如果是更多次呢),这显然是不能接受的。这时候我们可以通过泛型来进行代码重用。三个函数参数类型分别是int、float、double,那么我们合并三个函数为一个函数,参数类型就不能是任一确定类型,我们可以假定这个类型是T(取自Type首字母,当然.net许多类库的代码会使用诸如TEntityTElement之类的替代符可能更容易理解),那么我们可以将如上三个函数进行合并,如下:

public static void AddAndPrint(T t1, T t2)
{
    Console.WriteLine(string.Format("The value is {0}", t1.ToString() + "@" + t2.ToString()));
}

 那么可以通过如下方式将类型传入(因为是静态函数,因此每次调用的时候在类名后面以如<int>的形式指定其类型,如果调用非静态函数,那么在调用构造函数的时候指定即可):

class MyHelper<T>
{
     ...
 }

 注意,MyHelper<T>与AddAndPrint(T t1, T t2)须一致,当然也可以有多种类型,如MyHelper<T1,T2>与AddAndPrint(T1 t1,T2 t2),完整代码如下:

class MyHelper<T>
{
    public static void AddAndPrint(T t1, T t2)
    {
        Console.WriteLine(string.Format("The value is {0}", t1.ToString() + "@" + t2.ToString()));
    }
}
 
    static void Main(string[] args)
    {
        MyHelper<int>.AddAndPrint(100, 120);
        MyHelper<double>.AddAndPrint(100.123F, 120F);
        MyHelper<float>.AddAndPrint(100.456D, 120.666D);
        Console.ReadKey();
    }

 

2 泛型方法:swap()

 

  1.     class data  
  2.     {//swap方法,ref是按地址传递  
  3.         public static void swap<T>(ref T a, ref T b)  
  4.         {  
  5.             T temp;  
  6.             temp = a;  
  7.             a = b;  
  8.             b = temp;  
  9.         }  
  10.         static void Main(string[] args)  
  11.         {  
  12.             string a = "HC";  
  13.             string b = "666";  
  14.             swap(ref a,ref b);  
  15.             Console.WriteLine(a+"\t"+b); //结果 666    HC  
  16.         }  
  17.     }  

3 泛型委托

posted @ 2017-03-16 22:50  小猫钓鱼吃鱼  阅读(161)  评论(0编辑  收藏  举报