zoukankan      html  css  js  c++  java
  • 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+" "+b); //结果 666    HC  
    16.         }  
    17.     }  

    3 泛型委托

  • 相关阅读:
    javascript练习:87设置对象事件的方法
    javascript练习:810事件与this运算符
    SQL: case when的用法(转)
    C++ :stringstream介绍,使用方法与例子(转)
    【玩转.Net MF – 01】Flash远程读写
    【.Net Micro Framework PortingKit – 13】LCD驱动开发
    【玩转.Net MF – 03】远程文件查看器
    【玩转.Net MF – 02】让PC成为MF的鼠标键盘
    【.Net Micro Framework PortingKit – 12】SysTick驱动开发
    【.Net Micro Framework PortingKit – 11】NandFlash驱动开发
  • 原文地址:https://www.cnblogs.com/yachao1120/p/6562108.html
Copyright © 2011-2022 走看看