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

时间:2008-09-19 04:43:44

标签: c# .net vb.net generics

来自Wikipedia

  

通用编程是一种风格   计算机编程在其中   算法是用...编写的   将要指定的后续类型   然后在需要时进行实例化   作为参数提供的特定类型   并由Ada开创了   出现在1983年。这种方法   允许编写常用功能或   仅在集合中有所不同的类型   使用时操作的类型,   从而减少重复。

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

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

还有哪些其他语言也有仿制药?

15 个答案:

答案 0 :(得分:6)

C#和VB有泛型来利用底层CLR中的泛型支持(或者反过来?)。它们允许您使用静态类型语言编写代码,这些语言可以应用于多种类型,而无需为您使用它们的每种类型重写代码(运行时将为您执行此操作)或使用 System.Object 并随处投射(就像我们与ArrayList一样)。

您是否阅读了article

这些语言也有泛型:

  • C ++(通过模板
  • Ada(通过模板
  • 艾菲尔
  • D(通过模板
  • 的Haskell
  • 爪哇

答案 1 :(得分:5)

就个人而言,我认为它们可以节省大量时间。我仍在使用.NET Framework 1.1,并且每次需要特定集合时,都需要通过实现CollectionBase来创建强类型集合。使用Generics,您只需要像List<MyObject>那样声明您的收藏,并且已经完成。

答案 2 :(得分: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);

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

答案 3 :(得分:2)

来自MSDN

  

泛型为a提供解决方案   早期版本的限制   公共语言运行库和C#   泛化的语言   通过将类型转换为和来完成   来自通用基类型Object。   通过创建泛型类,您可以   创建一个类型安全的集合   在编译时。

阅读该文章的其余部分,了解一些Generics如何提高代码可读性和性能的示例。

答案 4 :(得分:2)

对他们来说,最常见的用途可能是使用强类型的ArrayLists。在.NET 1.1中,您要么必须将所有内容从对象转换为所需的Type,要么使用类似CodeSmith的内容来生成强类型的ArrayList。

此外,它们有助于减少boxing。同样,在.NET 1.x中,如果您尝试使用具有值类型的ArrayList,则最终会在整个地方装箱和取消装箱对象。泛型通过让你定义Type,无论是Reference还是Value来避免这种情况。

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

答案 5 :(得分:1)

.NET中的泛型非常适合对象集合。您可以根据需要定义对象类型,并且可以拥有List而不编写任何代码,并且可以访问.NET List泛型集合的所有高效功能,同时对T类型安全。它是好东西。

答案 6 :(得分:1)

如果你熟悉它,那么泛型就是基于c ++模板的概念。

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

然后可以为列表分配任何类型的int,string甚至自定义类型,在构造列表时分配类型。但是你可以使用列表操作添加删除等。

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

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

答案 7 :(得分:1)

.net中的泛型,与继承和扩展方法一样,允许减少代码重复。让我通过重构来解释。

如果具有共同祖先的所有类都具有公共方法,则将公共方法放在类的共同祖先(继承)中。

如果某些类具有使用公共合同来实现某些结果的通用方法,请将该公共方法转换为该公共合同的扩展方法。

如果某些方法或类具有相同的代码,这些代码仅根据所采用的类型而不同(特别是在类型的详细信息与方法的操作无关的情况下),请将这些方法或类收集到通用中。 / p>

答案 8 :(得分:1)

它们使用值类型提高集合的性能,因为不需要装箱/取消装箱。它们使用起来要干净得多,因为您不必将对象(例如使用ArrayList)转换为所需类型 - 同样它们有助于强制实现类型安全。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

解释它的最简单方法是举个例子。假设您需要两个哈希表,一个将string类型的对象映射到int类型,另一个将string类型的对象映射到double类型。您可以定义Hashtable,然后使用K和V类型。如果没有泛型,你必须使用'对象'类型,除了必须被强制转换之外,还放弃类型安全。只需实例化Hashtable和Hashtable,你就可以使用适当的类型检查和所有哈希表。

答案 12 :(得分:0)

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

像Perl和Javascript这样的动态语言不具有相同的类型限制,因此它们可以以较少的工作获得大致相同的好处。

答案 13 :(得分:0)

在Objective-C中,您可以使用协议来实现泛型的目标。然而,由于语言的类型很弱,所以它通常不像你在打击类型系统时为许多类型使用一个代码路径那么重要。

答案 14 :(得分:0)

我个人非常喜欢泛型,因为我不需要编写所有代码。

What is Inversion of Control?