2008-09-19 63 views
6

Wikipedia为什么C#和VB有泛型?他们提供什么好处?泛型,FTW

泛型编程是在 算法都写在对被指定的,后来是类型 方面 计算机编程风格 则需要 当实例化提供作为参数 并通过阿达其中 出现在1983年这种方法开创 允许写入通用功能或 类型在其上使用时操作区别仅在于存在该组 类型,特定类型从而减少重复。

泛型提供了定义稍后指定类型的功能。您不必将项目转换为使用它们的类型,因为它们已经输入。

为什么C#和VB有泛型?他们提供什么好处?你发现使用它们有什么好处?

其他语言也有泛型?

回答

6

C#和VB有泛型来利用底层CLR中的泛型支持(或者相反?)。它们允许您使用静态类型语言编写代码,该语言可以应用于多种类型,而无需重新编写每种类型的代码(运行时将为您执行此操作)或以其他方式使用System.Object和无处不在(比如我们不得不使用ArrayList)。

您是否阅读article

这些语言也有泛型:

  • C++(经由模板
  • 阿达(经由模板
  • 艾菲尔
  • d(经由模板
  • 哈斯克尔
  • Java
+0

泛型和模板之间有一些区别。 C++,Ada和D拥有后者,其余部分不确定。 – BCS 2008-09-19 04:49:45

+2

除了其他内容,模板仍允许使用泛型进行编写。 – 2008-09-19 04:50:29

0

常见的例子是集合。例如一组类型T,作为Add(T)方法和T get()方法。相同的代码,不同类型的安全集合。

C++,D,Ada和其他人都有模板,这是一个泛型的超集,它可以做一点点不同的bug,得到相同的最终结果(然后是一些)。

IIRC Java有泛型,但我不做Java。

0

解释它最简单的方法就是举一个例子。假设您需要两个哈希表,一个将字符串类型的对象映射到int类型,另一个将字符串类型的对象映射到double类型。你可以定义Hashtable,然后使用K和V类型。如果没有泛型,你必须使用“对象”类型,除了必须被赋予有意义的外,还要放弃类型安全。只要实例化Hashtable和Hashtable,并且已经有适当的类型检查和所有的哈希表。

0

Java也有泛型。 C++有模板。

像Perl和Javascript这样的动态语言没有相同的类型限制,所以他们在减少工作时获得大部分相同的好处。

+0

不是好处,因为它们根本不提供任何类型的安全。 – Thomas 2008-09-19 05:02:01

2

MSDN

泛型提供早期版本中 公共语言运行时的溶液至 限制,并且其中概括是实现通过从通用铸造类型和 的C# 语言基类型对象。 通过创建一个通用类,您可以在编译时创建一个类型安全的 集合。

阅读该文的其余部分,以查看泛型如何提高代码的可读性和性能的一些示例。

5

我个人认为它们可以节省很多时间。我仍在使用.NET Framework 1.1,每次需要特定的集合时,都需要通过实现CollectionBase来创建强类型集合。随着泛型,你只需要声明你的集合就像那个List<MyObject>并且完成了。

2

他们最常见的用途可能是使用强类型的ArrayLists。在.NET 1.1中,您必须将所有对象都从对象转换为所需的类型,或者使用类似CodeSmith的东西来生成强类型的ArrayList。它们帮助减少boxing。同样,在.NET 1.x中,如果您尝试使用带有值类型的ArrayList,则最终会在整个位置装箱并拆箱。泛型通过让您定义类型(无论是引用还是值)来避免这种情况。

还有他们其他方便的用途太,事件处理程序,LINQ查询等

1

泛型在.NET中是优秀的对象集合。你可以定义你的对象类型,但是你想要的并且能够拥有一个List,而不用为它编写任何代码,并且可以访问.NET List泛型集合的所有高效功能,同时对T是类型安全的。好东西。

0

在Objective-C中,您可以使用协议来实现泛型的目标。但是,由于语言的输入类型很弱,因此通常不像在打击类型系统时为多种类型使用一种代码路径那样担心。

1

如果您熟悉C++,泛型就建立在C++模板的概念之上。

它是实现算法或数据结构的一种方式,但是延迟了它使用的实际类型。

然后可以将列表分配给您所选择的任何类型int,字符串,甚至是类型在列表构造时分配的自定义类型。但你将能够使用列表操作添加删除等。

通过习惯泛型,你可以真正节省大量的编码工作。而且您不必在类型之间进行装箱和取消装箱。

Java也有泛型。他们被称为通配符。

1

泛型在.NET,如继承和扩展方法,允许减少代码重复。让我通过重构来解释。

如果所有具有共同祖先的类都有一个共同的方法,请将常用方法放在类的共同祖先(继承)中。

如果某些类有一个使用公共合约实现某些结果的常用方法,请将常用方法变为该公共合约上的扩展方法。

如果某些几个方法或类具有相同的代码,而这些代码仅因作用于的类型不同而不同(特别是类型的细节与方法的操作无关),请将这些方法或类收集到一个通用类中。

1

它们增加了使用值类型的集合的性能,因为不需要装箱/拆箱。因为你不必将一个对象(例如使用ArrayList)转换为所需的类型,所以它们使用起来非常干净 - 同样它们也有助于强制类型安全。

3

考虑以下方法签名:

//Old and busted 
public abstract class Enum 
{ 
    public static object Parse(Type enumType, string value); 
} 
//To call it: 
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString); 

//New and groovy 
public abstract class Enum 
{ 
    public static T Parse<T>(string value); 
} 

//To call it: 
MyEnum x = Enum.Parse<MyEnum>(someString); 

看马:没有运行时类型的操作。

1

泛型相对于C#中的非泛型类型(非Java,Java是另一回事)的最大优势在于它们更快。 JIT生成一个给定类型的最佳机器码。 List<int>实际上是一个ints列表,而不是包含int的整数对象。这使得泛型类型非常快速,并且类型安全,可以帮助您在编译时检测到很多错误:)

相关问题