关于.net:为什么C#和VB具有泛型? 他们提供什么好处? FTW泛型

关于.net:为什么C#和VB具有泛型? 他们提供什么好处? FTW泛型

Why do C# and VB have Generics? What benefit do they provide? Generics, FTW

从维基百科:

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.

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

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

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


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

您读过这篇文章吗?

这些语言也具有泛型:

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

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


考虑以下方法签名:

1
2
3
4
5
6
7
//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);
1
2
3
4
5
6
7
8
//New and groovy
public abstract class Enum
{
  public static T Parse< T >(string value);
}

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

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


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

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

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


从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.

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


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


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


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

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

如果某些类具有使用公共合同实现某种结果的通用方法,则将该公共方法变成对该公共合同的扩展方法。

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


如果您熟悉泛型,它们将基于c ++中的模板概念。

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

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

通过熟悉泛型,您确实可以节省很多编码工作。而且您不必在类型之间进行装箱和拆箱。

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


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


就我个人而言,我是泛型的忠实拥护者,因为我不必编写所有代码。

什么是控制反转?


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


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

像Perl和Javascript这样的动态语言没有相同的类型限制,因此它们以较少的工作量获得了相同的收益。


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


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

C ++,D,Ada等具有模板,泛型的超集对此做了一点不同,但最终得到相同的最终结果(然后是某些结果)。

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


推荐阅读