A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阮佳佳 中级黑马   /  2012-12-25 09:19  /  2888 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最好举例说明。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
泛型最主要最用之一是用到集合中,泛型集合可以对元素的类型进行约束,使类型安全。不是所允许的类型是无法添加到泛型集合中的。
还有一点就是泛型的性能比较高,因为它们固定了类型就不用像ArrayList那样用到元素的时候需要装箱/拆箱的过程。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 许晓华 于 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: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.         }
复制代码
回复 使用道具 举报
可以看到泛型方法Swap<T>替换了上面3个swap函数的重载版本,大大提高了代码的可重用性

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
泛型理解为,就是数组化一个对象Object,比如List<这是一个类名> A =New List<>;  A.add其实增加元素,我个人理解就好比 string[] a  无非这个a必须定义一共有多少个元素,而List不用定义有多少个元素,一般用在不确定的元素的集合,并且A已经被确定为是字符串类型,而List则可以定义不同的,例如类,结构,字符,数字等等

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
管冉 中级黑马 2012-12-26 01:18:55
7#
基础测试抽到这个题目:
将几个int、字符串添加到ArrayList中,然后序列化到文件中,再反序列化回来。
昨天提问的 没人回答
原来是泛型啊
序列化和反序列化又是怎么实现的啊??

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马