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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘真 中级黑马   /  2012-4-9 14:10  /  2427 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型应该怎么用?或者说什么情况下要用泛型?使用泛型有哪些好处?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

4 个回复

倒序浏览
通过泛型可以定义类型安全的数据类型,它最显著的应用就是创建集合类,可以约束集合类内的元素类型。比较常用的就是List<T>和Dictionary<k,v>例如:
List<T> aa=new List<T>();T表示在集合中规定的类型,通过索引来获得其中的值。
Dictionary<k,v> bb =new Dictionary<k,v>(); k表示键的类型,v表示值得类型,通过键来获得值。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
什么是泛型?

    通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。
    您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。
    为此,需要使用 < 和 > 括号,以便将一般类型参数括起来。

例如,可以按如下方式定义和使用一般堆栈:

public class Stack
{
   T[] m_Items;
   public void Push(T item)
   {}
   public T Pop()
   {}
}
Stack stack = new Stack();
stack.Push(1);
stack.Push(2);
int number = stack.Pop();
    代码块 2 显示一般堆栈的完整实现。
    将代码块 1 (上篇《C#泛型简介》)与代码块 2 进行比较,您会看到,好像 代码块 1 中每个使用 Object 的地方在代码块 2 中都被替换成了 T,除了使用一般类型参数 T 定义 Stack 以外:

public class Stack
{}

在使用一般堆栈时,必须通知编译器使用哪个类型来代替一般类型参数 T(无论是在声明变量时,还是在实例化变量时):

Stack stack = new Stack();
编译器和运行库负责完成其余工作。所有接受或返回 T 的方法(或属性)都将改为使用指定的类型(在上述示例中为整型)。
代码块 2. 一般堆栈

public class Stack
{
   readonly int m_Size;
   int m_StackPointer = 0;
   T[] m_Items;
   public Stack():this(100)
   {}
   public Stack(int size)
   {
      m_Size = size;
      m_Items = new T[m_Size];
   }
   public void Push(T item)
   {
      if(m_StackPointer >= m_Size)
         throw new StackOverflowException();
      m_Items[m_StackPointer] = item;
      m_StackPointer++;
   }
   public T Pop()
   {
      m_StackPointer--;
      if(m_StackPointer >= 0)
      {
         return m_Items[m_StackPointer];
      }
      else
      {
         m_StackPointer = 0;
         throw new InvalidOperationException("Cannot pop an empty stack");
      }
   }
}


注 T 是一般类型参数(或类型参数),而一般类型为 Stack。Stack 中的 int 为类型实参。
该编程模型的优点在于,内部算法和数据操作保持不变,而实际数据类型可以基于客户端使用服务器代码的方式进行更改。
.NET 中的泛型使您可以重用代码以及在实现它时付出的努力。类型和内部数据可以在不导致代码膨胀的情况下更改,而不管您使用的是值类型还是引用类型。您可以一次性地开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它,并且全部具有编译器支持和类型安全。因为一般代码不会强行对值类型进行装箱和取消装箱,或者对引用类型进行向下强制类型转换,所以性能得到显著提高。对于值类型,性能通常会提高 200%;对于引用类型,在访问该类型时,可以预期性能最多提高 100%(当然,整个应用程序的性能可能会提高,也可能不会提高)。本文随附的源代码包含一个微型基准应用程序,它在紧密循环中执行堆栈。该应用程序使您可以在基于 Object 的堆栈和一般堆栈上试验值类型和引用类型,以及更改循环迭代的次数以查看泛型对性能产生的影响。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
刘冬晓 发表于 2012-4-9 14:58
通过泛型可以定义类型安全的数据类型,它最显著的应用就是创建集合类,可以约束集合类内的元素类型。比较常 ...

可以定义类型安全的数据类型,它最显著的应用就是创建集合类。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
楼主,支持!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马