zoukankan      html  css  js  c++  java
  • 泛型介绍

    泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合中和在集合上运行的方法中。

    对应的命名空间为System.Collections.Generic

    可以创建自定义泛型类型和方法,以提供自己的通用解决方案,设计类型安全的高效模式。

    泛型的优点

    在公共语言运行库和c#的早期版本中,通用化是通过在类型与通用机类型objec之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案通过创建泛型类,您可以创建一个在编译时类型安全的集合。

    使用非泛型集合类的限制可以通过编写一笑程序来演示,该程序利用,该程序利用.net framework基类库中的ArrayList集合类。ArrayList是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。

    System.Collections.ArrayList list1 = new System.Collections.ArrayList();
    list1.Add(3);
    list1.Add(105);
     
    System.Collections.ArrayList list2 = new System.Collections.ArrayList();
    list2.Add("It is raining in Redmond.");
    list2.Add("It is snowing in the mountains.");

    这种方便是需要代价的,添加到ArrayList中的任何引用或者值类型都隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时,进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。

    另一个限制是缺少编译时类型检查;因为ArrayList将把所有项都强制转换为Objec,所以在编译时,无法防止客户端代码执行以下操作:

    System.Collections.ArrayList list = new System.Collections.ArrayList();
    // Add an integer to the list.
    list.Add(3);
    // Add a string to the list. This will compile, but may cause an error later.
    list.Add("It is raining in Redmond.");
    
    int t = 0;
    // This causes an InvalidCastException to be returned.
    foreach (int x in list)
    {
        t += x;
    }
    尽管将字符串和整形数字 组合在一个ArrayList中的做法在创建异类集合时是完全合法的,有时是有意图的,但这种做法更可能产生编程错误,并且知道运行时才能检测到此错误。
    ArrayList 和其他相类似真正需求的是:客户端代码基于每个实例指定这些类要使用的具体数据类型的方式。这样就不再需要向上强制转换为System.objec.同时编译器也可以进行类型检查。换句话说,ArrayList需要一个type parameter。这正是泛型所能提供的。在N:System.Collections.Generic命名空间的泛型List<T>集合中,向该集合添加项的操作类似与以下形式:
    List<int> list1 = new List<int>();
    // No boxing, no casting:
    list1.Add(3);
    // Compile-time error:
    // list1.Add("It is raining in Redmond.");
    对于客户端代码,与ArrayList相比,使用List<T>时添加的唯一语法是声明和实例化中的类型参数。虽然这稍微增加了些编码的复杂性,但是好处是您可以创建一个比ArrayList更安全并且速度更快的列表,特别适合列表项是值类型的情况。
     
     
     
     
     
     
     
  • 相关阅读:
    LeetCode 130. 被围绕的区域 (DFS)
    LeetCode 200. 岛屿数量 (BFS)
    LeetCode 200. 岛屿数量 (DFS)
    Win10下Anaconda命令行相关操作
    LeetCode 53. 最大子序和
    从尾到头打印链表
    字符串逆序
    交换俩字符串
    LeetCode 147. 对链表进行插入排序
    LeetCode 面试题 02.08. 环路检测
  • 原文地址:https://www.cnblogs.com/RealAlex/p/2920702.html
Copyright © 2011-2022 走看看