C#泛型

Posted zwj-199306231519

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#泛型相关的知识,希望对你有一定的参考价值。

  

1.泛型与其他类型作对比:

  我们现在要求实现一个类

  (1)一般声明类

   public class Stack

  
    private int[] m_item;
    public int Pop() return 0
    public void Push(int itme)
    public Stack(int i)
    
      this.m_item = new int[i];
    
  

  以上代码缺点是只能处理一种数据类型(int),换个string类型就不行了。

  (2)优秀的程序员想到用一个通用数据类型object来实现这个类

  public class Stack

  
    private object[] m_item;
    public object Pop() return 0
    public void Push(object itme)
    public Stack(object i)
    
      this.m_item = new object[i];
    
  

  这个类写的不错,非常灵活,但是在处理数据时,若数据量大,则会出现不断地装箱和拆箱操作,这将在托管堆上分配和回收大量的变量,则性能损失非常严重。

  (3)使用泛型

  

  public class Stack<T>

  
    private T[] m_item;
    public T Pop() return 0
    public void Push(T itme)
    public Stack(T i)
    
      this.m_item = new T[i];
    
  

  此类就解决了装箱和拆箱频繁带来的性能损失问题。

2.方法对比

  以下为int和string类型的比较方法

  public class CompareClass
  

    //整数比较
    public static int CompareInt(int value1, int value2)
    
      if (value1.CompareTo(value2) > 0)
        return value1;
      else
        return value2;
    
    //字符串比较
    public static string CompareInt(string value1, string value2)
    
      if (value1.CompareTo(value2) > 0)
        return value1;
      else
        return value2;
    

  

  以上代码对于不同类型要不同处理,此时可以写为泛型:

  public class CompareClass<T> where T : IComparable
  
    public static T CompareValue(T value1, T value2)
    
      if (value1.CompareTo(value2) > 0)
        return value1;
      else
        return value2;
    

  

3.时间消耗对比

  (1)不用泛型代码

  public static void TestGeneric()
  
    Stopwatch stopwatch = new Stopwatch();

    //ArrayList不是泛型
    ArrayList array = new ArrayList();
    stopwatch.Start();
    for (int i = 0; i < 10000000; i++)
    
      array.Add(i);
    
    stopwatch.Stop();
    Console.WriteLine(stopwatch.Elapsed);
  

  (2)用泛型代码

  public static void TestGeneric()
  
    Stopwatch stopwatch = new Stopwatch();

    //List<int>为泛型
    List<int> gelist = new List<int>();
    stopwatch.Start();
    for (int i = 0; i < 10000000; i++)
    
      gelist.Add(i);
    
    stopwatch.Stop();
    Console.WriteLine(stopwatch.Elapsed);
  

  (1)耗时2秒多,(2)耗时几百毫秒

4.使用泛型的好处:

  (1)泛型能够实现代码复用

  (2)泛型能够减少装箱拆箱操作,避免性能损失

  (3)减少处理器的负担,加快运行速度

 

以上是关于C#泛型的主要内容,如果未能解决你的问题,请参考以下文章

C#泛型详解

C#泛型详解

C#中的泛型和泛型集合

C#规范整理·泛型委托事件

C#泛型学习

JavaSE——泛型自定义泛型泛型通配符上下限