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

时间:2020-03-06 14:24:44  来源:igfitidea点击:

从维基百科:

Generic programming is a style of
  computer programming in which
  algorithms are written in terms of
  to-be-specified-later types that are
  then instantiated when needed for
  specific types provided as parameters
  and was pioneered by Ada which
  appeared in 1983. This approach
  permits writing common functions or
  types that differ only in the set of
  types on which they operate when used,
  thus reducing duplication.

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

为什么Cand VB具有泛型?他们提供什么好处?我们发现使用它们有什么好处?

还有哪些其他语言具有泛型?

解决方案

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

C ++,D,Ada和其他人有模板,一个泛型的超集来做这个,有点不同的错误会得到相同的最终结果。

IIRC Java具有泛型,但我不使用Java。

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

Vd是否可以使用泛型来利用底层CLR中的泛型支持(或者是相反的方式?)。它们使我们可以使用静态类型的语言编写代码,该语言可以应用于多种类型,而无需为使用它们的每种类型重写代码(运行时将为我们完成),或者使用System.Object并在各处进行转换(就像我们必须使用ArrayList一样)。

我们读过这篇文章吗?

这些语言也具有泛型:

  • C ++(通过模板)
  • Ada(通过模板)
  • 埃菲尔铁塔
  • D(通过模板)
  • 哈斯克尔
  • 爪哇

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

诸如Perl和Javascript之类的动态语言没有相同的类型限制,因此它们以较少的工作量获得了相同的好处。

从MSDN:

Generics provide the solution to a
  limitation in earlier versions of the
  common language runtime and the C#
  language in which generalization is
  accomplished by casting types to and
  from the universal base type Object.
  By creating a generic class, you can
  create a collection that is type-safe
  at compile-time.

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

就个人而言,我认为它们可以节省很多时间。我仍在使用.NET Framework 1.1,每次我们想要特定的集合时,都需要通过实现CollectionBase创建一个强类型的集合。使用泛型,我们只需要像List <MyObject>这样声明集合就可以了。

它们的最常见用途可能是具有强类型的ArrayList。在.NET 1.1中,我们或者必须将对象的所有内容强制转换为所需的Type,或者使用CodeSmith之类的东西来生成强类型的ArrayList。

此外,它们有助于减少拳击。同样,在.NET 1.x中,如果我们尝试使用具有值类型的ArrayList,最终将在整个位置对对象进行装箱和拆箱。泛型可以通过定义"引用"或者"值"的类型来避免这种情况。

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

.NET中的泛型非常适合对象集合。我们可以根据需要定义对象类型,并且可以拥有一个List,而无需为此编写任何代码,并且可以访问.NET List通用集合的所有有效功能,同时对T类型安全。好东西。

在Objective-C中,我们可以使用协议来实现泛型的目标。但是,由于该语言是弱类型的,因此与在类型系统中为多种类型使用一个代码路径的斗争时,通常不必担心。

如果我们熟悉泛型,则它们是基于c ++中模板的概念构建的。

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

然后可以使用我们选择的任何类型来分配列表,例如int,字符串,甚至是在构建列表时分配类型的自定义类型。但是我们将能够使用列表操作添加删除等。

通过习惯使用泛型,我们确实可以节省很多编码工作。而且我们不必在类型之间进行装箱和拆箱。

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

就我个人而言,由于无需编写所有代码,所以我非常喜欢泛型。

什么是控制反转?

.net中的泛型像继承和扩展方法一样,可以减少代码重复。让我通过重构的方式进行解释。

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

如果某些类具有使用公共契约的通用方法以实现某些结果,则将该公共方法变为对该公共契约的扩展方法。

如果某些几种方法或者类具有相同的代码,只是它们所作用的类型不同(尤其是在类型的详细信息与该方法的操作无关的情况下),则请将这些方法或者类收集到一个泛型中。

由于不需要装箱/拆箱,它们可以提高使用值类型的集合的性能。它们使用起来更加清洁,因为我们不必将对象(例如,使用ArrayList)强制转换为所需的类型,并且它们同样有助于实现类型安全。

考虑以下方法签名:

//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);

看起来:没有运行时类型操纵。

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