黑马程序员技术交流社区

标题: C#泛型的理解和应用场景? [打印本页]

作者: 阮佳佳    时间: 2012-12-25 09:19
标题: C#泛型的理解和应用场景?
最好举例说明。
作者: 苗昆明    时间: 2012-12-25 11:55
泛型最主要最用之一是用到集合中,泛型集合可以对元素的类型进行约束,使类型安全。不是所允许的类型是无法添加到泛型集合中的。
还有一点就是泛型的性能比较高,因为它们固定了类型就不用像ArrayList那样用到元素的时候需要装箱/拆箱的过程。

作者: 许晓华    时间: 2012-12-25 15:31
本帖最后由 许晓华 于 2012-12-25 15:32 编辑

楼上谈了泛型的类型安全与高效率的优点。我再补充一个泛型非常重要的优点:代码重用
先看一段重用性低的代码(没有使用泛型)
  1. using System;
  2. class Program
  3. {
  4.     static void Main(string[] args)
  5.     {
  6.         int a = 2;
  7.         int b = 9;
  8.         Console.WriteLine("初始时a={0},b={1}", a, b);
  9.         Swap(ref a, ref b);
  10.         Console.WriteLine("交换后a={0},b={1}", a, b);
  11.         float c = 2.5F;
  12.         float d = 9.9F;
  13.         Console.WriteLine("初始时a={0},b={1}", c, d);
  14.         Swap(ref c, ref d);
  15.         Console.WriteLine("交换后a={0},b={1}", c, d);
  16.         string e = "Hello";
  17.         string f = "World";
  18.         Console.WriteLine("初始时a={0},b={1}", e, f);
  19.         Swap(ref e, ref f);
  20.         Console.WriteLine("交换后a={0},b={1}", e, f);

  21.     }
  22. public static void Swap(ref int a, ref int b)
  23.     {
  24.         int c;
  25.         c = a;
  26.         a = b;
  27.         b = c;
  28.     }
  29.     public static void Swap(ref float a, ref float b)
  30.     {
  31.         float c;
  32.         c = a;
  33.         a = b;
  34.         b = c;
  35.     }
  36.     public static void Swap(ref string a, ref string b)
  37.     {
  38.         string c;
  39.         c = a;
  40.         a = b;
  41.         b = c;
  42.     }
  43. }
复制代码

作者: 许晓华    时间: 2012-12-25 15:34
本帖最后由 许晓华 于 2012-12-25 15:35 编辑

再看一下使用泛型改写后的重用性高的代码
  1. using System;
  2. class Program
  3. {
  4.     static void Main(string[] args)
  5.     {
  6.         int a = 2;
  7.         int b = 9;
  8.         Console.WriteLine("初始时a={0},b={1}", a, b);
  9.         Swap(ref a, ref b);
  10.         Console.WriteLine("交换后a={0},b={1}", a, b);
  11.         float c = 2.5F;
  12.         float d = 9.9F;
  13.         Console.WriteLine("初始时a={0},b={1}", c, d);
  14.         Swap(ref c, ref d);
  15.         Console.WriteLine("交换后a={0},b={1}", c, d);
  16.         string e = "Hello";
  17.         string f = "World";
  18.         Console.WriteLine("初始时a={0},b={1}", e, f);
  19.         Swap(ref e, ref f);
  20.         Console.WriteLine("交换后a={0},b={1}", e, f);

  21.     }
  22. public  static void Swap<T>(ref T a, ref T b)
  23.         {
  24.             T c;
  25.             c = a;
  26.             a=  b;
  27.             b= c;
  28.         }
复制代码

作者: 许晓华    时间: 2012-12-25 15:36
可以看到泛型方法Swap<T>替换了上面3个swap函数的重载版本,大大提高了代码的可重用性
作者: 杭州-杨    时间: 2012-12-25 15:53
泛型理解为,就是数组化一个对象Object,比如List<这是一个类名> A =New List<>;  A.add其实增加元素,我个人理解就好比 string[] a  无非这个a必须定义一共有多少个元素,而List不用定义有多少个元素,一般用在不确定的元素的集合,并且A已经被确定为是字符串类型,而List则可以定义不同的,例如类,结构,字符,数字等等
作者: 管冉    时间: 2012-12-26 01:18
基础测试抽到这个题目:
将几个int、字符串添加到ArrayList中,然后序列化到文件中,再反序列化回来。
昨天提问的 没人回答
原来是泛型啊
序列化和反序列化又是怎么实现的啊??


作者: 黄林    时间: 2012-12-26 14:14
他们说得差不多了,C#泛型可以理解运行库动态生成的模板(C++),从泛型继承:当我们需要定义自己的集合类(比如设计一个扑克游戏,初始化一副牌Cards),这时我们可以用两种方法,List<Card> cards=new List<Card>();    public  class Cards:List<Card>{}后者和前者效果一样,但后者可以在必要的时候为Cards类添加其它成员和构造函数等。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2