Why do C# and VB have Generics? What benefit do they provide? Generics, FTW从维基百科:
泛型提供了定义以后指定的类型的能力。 您不必将项目强制转换为类型就可以使用它们,因为它们已经被键入。 为什么C#和VB具有泛型? 他们提供什么好处? 您发现使用它们有什么好处? 还有哪些其他语言具有泛型? C#和VB具有泛型以利用底层CLR中的泛型支持(或者反过来吗?)。它们允许您用一种静态类型的语言编写代码,该语言可以应用于多种类型,而无需为使用它们的每种类型重写代码(运行时将为您完成),否则可以使用System.Object并在各处进行转换(就像我们必须使用ArrayList一样)。 您读过这篇文章吗? 这些语言也具有泛型:
就个人而言,我认为它们可以节省很多时间。我仍在使用.NET Framework 1.1,并且每次您想要特定集合时,都需要通过实现CollectionBase创建强类型集合。使用泛型,您只需要像 考虑以下方法签名:
看起来:没有运行时类型操纵。 它们的最常见用法可能是具有强类型的ArrayList。在.NET 1.1中,您要么必须将对象的所有内容都强制转换为所需的Type,要么使用CodeSmith之类的东西来生成强类型的ArrayList。 此外,它们有助于减少拳击。同样,在.NET 1.x中,如果尝试使用具有值类型的ArrayList,则最终会在整个位置对对象进行装箱和拆箱。泛型可以通过定义"引用"或"值"的类型来避免这种情况。 它们还有其他方便的用途,例如事件处理程序,LINQ查询等。 从MSDN:
阅读该文章的其余部分,以查看一些泛型如何提高代码的可读性和性能的示例。
与C#中的非泛型类型相比,泛型的最大优势是Java的速度更快。 JIT生成给定类型可以提供的最佳机器代码。 由于不需要装箱/拆箱,它们可以提高使用值类型的集合的性能。因为您不必将对象(例如,使用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。 |