none
请问泛型和集合有什么区别? RRS feed

  • 问题

  • 泛型和集合不是都可以添加成员时只能使用指定某一种对象或数据类型 吗。 具体有什么区别?在性能上那个更好?在使用上有什么建议?

    谢谢

    2008年4月19日 13:07

答案

  • 事件只是委托的一种应用。

    而泛型是以前普通集合的改进和升级。

    泛型类型的优点

    泛型类型用作声明几个不同编程元素的基础,而每个元素均处理特定的数据类型。泛型类型的替代项有:

    1. Object 数据类型进行处理的单一类型。

    2. 一组特定于类型的类型版本,每个版本单独进行编码并处理一种特定的数据类型,如 StringInteger 或用户定义的类型(如 customer)。

    与上述替代项相比,泛型类型具有以下优点:

    • 类型安全。泛型类型强制实施编译时类型检查。而基于 Object 的类型可接受任何数据类型,因此,您必须编写代码以检查是否可接受某种输入数据类型。利用泛型类型,编译器可以在运行时之前捕获类型不匹配错误。

    • 性能。泛型类型无需对数据进行装箱和取消装箱操作,原因是每种泛型类型均专用于一种数据类型。而基于 Object 的操作必须将输入数据类型进行装箱操作,以将它们转换为 Object,而且还要将预定输出的数据进行取消装箱操作。装箱和取消装箱操作会降低性能。

      此外,还要对基于 Object 的类型进行后期绑定,这意味着需要编写额外的代码才能在运行时访问它们的成员。这同样会降低性能。

    • 代码合并。只需定义泛型类型中的代码一次。而一组特定于类型的类型版本必须在每个版本中复制相同的代码,代码中唯一的不同就是特定于该版本的数据类型。利用泛型类型,特定于类型的版本全都利用原始的泛型类型生成。

    • 代码重用。对于不依赖特定数据类型的泛型代码,可以利用不同的数据类型重用它。可以经常重用此类代码(甚至利用最初未预料到的数据类型来重用它)。

    • IDE 支持。在使用通过泛型类型声明的构造类型时,集成开发环境 (IDE) 可以在您开发代码时给予更多的支持。例如,IntelliSense™ 可以显示适用于构造函数或方法的某个参数的特定于类型的选项。

    • 泛型算法。独立于类型的抽象算法非常适用于泛型类型。例如,可以将使用 IComparable 接口对项进行排序的泛型过程用于任何实现 IComparable 的数据类型。

    实际上,你可以把普通的集合跟泛型同时使用。泛型对于普通集合都有替代类,不存在只能用于普通集合而不能用于泛型集合的。

    2008年4月20日 5:42
    版主
  • 集合可以存入任何类型,但是实际存储都是用的object类型,要取出使用时有需要将object转回实际的类型(Box/Unbox),这就涉及到性能的问题

     

    而范型是强类型的,不需要转换,具体内容可以参看msdn

     

    实际使用建议尽量使用范型

    2008年4月20日 6:30
    版主

全部回复

  • 泛型也是集合,“泛型类型”是可适应对多种数据类型执行相同功能的单个编程元素。定义泛型类或过程时,无需为可能需要对其执行该功能的每个数据类型定义单独版本。但普通的集合里的元素是object类型,使用的时候需要很多的类型转换。

     

    泛型在使用的时候指定要处理的元素类型,所以泛型集合里的元素都是强类型的,在性能上和易用程度上都比普通集合好很多。

     

    非常推荐使用泛型集合代替普通的集合。

     

    关于泛型,请参考MSDN详细的解释:http://msdn2.microsoft.com/zh-cn/library/w256ka79(VS.80).aspx

    2008年4月20日 1:51
    版主
  • 谢谢, 泛型和集合 是不是类似 委托和事件的关系?

    非常推荐使用泛型集合代替普通的集合->有没有 只适合集合不适用于泛型的情况?
    2008年4月20日 4:32
  • 事件只是委托的一种应用。

    而泛型是以前普通集合的改进和升级。

    泛型类型的优点

    泛型类型用作声明几个不同编程元素的基础,而每个元素均处理特定的数据类型。泛型类型的替代项有:

    1. Object 数据类型进行处理的单一类型。

    2. 一组特定于类型的类型版本,每个版本单独进行编码并处理一种特定的数据类型,如 StringInteger 或用户定义的类型(如 customer)。

    与上述替代项相比,泛型类型具有以下优点:

    • 类型安全。泛型类型强制实施编译时类型检查。而基于 Object 的类型可接受任何数据类型,因此,您必须编写代码以检查是否可接受某种输入数据类型。利用泛型类型,编译器可以在运行时之前捕获类型不匹配错误。

    • 性能。泛型类型无需对数据进行装箱和取消装箱操作,原因是每种泛型类型均专用于一种数据类型。而基于 Object 的操作必须将输入数据类型进行装箱操作,以将它们转换为 Object,而且还要将预定输出的数据进行取消装箱操作。装箱和取消装箱操作会降低性能。

      此外,还要对基于 Object 的类型进行后期绑定,这意味着需要编写额外的代码才能在运行时访问它们的成员。这同样会降低性能。

    • 代码合并。只需定义泛型类型中的代码一次。而一组特定于类型的类型版本必须在每个版本中复制相同的代码,代码中唯一的不同就是特定于该版本的数据类型。利用泛型类型,特定于类型的版本全都利用原始的泛型类型生成。

    • 代码重用。对于不依赖特定数据类型的泛型代码,可以利用不同的数据类型重用它。可以经常重用此类代码(甚至利用最初未预料到的数据类型来重用它)。

    • IDE 支持。在使用通过泛型类型声明的构造类型时,集成开发环境 (IDE) 可以在您开发代码时给予更多的支持。例如,IntelliSense™ 可以显示适用于构造函数或方法的某个参数的特定于类型的选项。

    • 泛型算法。独立于类型的抽象算法非常适用于泛型类型。例如,可以将使用 IComparable 接口对项进行排序的泛型过程用于任何实现 IComparable 的数据类型。

    实际上,你可以把普通的集合跟泛型同时使用。泛型对于普通集合都有替代类,不存在只能用于普通集合而不能用于泛型集合的。

    2008年4月20日 5:42
    版主
  • 集合可以存入任何类型,但是实际存储都是用的object类型,要取出使用时有需要将object转回实际的类型(Box/Unbox),这就涉及到性能的问题

     

    而范型是强类型的,不需要转换,具体内容可以参看msdn

     

    实际使用建议尽量使用范型

    2008年4月20日 6:30
    版主
  •  

    谢谢楼上2位mvp专家的详细介绍!这对初学者真是不小的帮助。

    周日还在心情劳动!

    2008年4月20日 11:43