zoukankan      html  css  js  c++  java
  • 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)减少处理器的负担,加快运行速度

    111
  • 相关阅读:
    Ubantu 安装Redis
    传说中的WCF(5):数据协定(a)
    传说中的WCF(4):发送和接收SOAP头
    传说中的WCF(3):多个协定
    传说中的WCF(2):服务协定的那些事儿
    传说中的WCF(1):这东西难学吗?
    Linq教程
    Installutil.exe的位置和路径
    uni-app中对输入框的判断与提示(密码格式为6-12位,必须有大小写字母和数字组成)
    uni-app系列回顾总结----项目国际化
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/11627196.html
Copyright © 2011-2022 走看看