zoukankan      html  css  js  c++  java
  • 第6章 泛型

    泛型可以创建独立于被包含类型的类和方法

    性能、类型的安全性、二进制代码重用、代码的拓展、命名约定

    6.1.1 性能

    var list = new ArrayList();
    list.Add(4);  //装箱
    int il = (int) list [0]; //拆箱
    
    var list = new List<int>();
    list.Add(44); //不用装箱
    int il = list[0]; //不用拆箱

    ArrayList类存储对象,把对象作为参数,需要大量装箱和拆箱。

    List<T>类不使用对象,而是在使用时定义类型,定义的类型在JIT编译器动态生成的类中使用,不再进行装箱和拆箱操作

    6.1.2 类型安全

    ArrayList可以Add任意类型,foreach遍历int类型时遇到不是int就会异常。

    List<T>泛型类型T定义了允许使用的类型

    6.1.3 二进制代码的重用

    泛型类型可以定义一次,可以用许多不用的类型实例化

    var list = new List<int>();
    var stringList = new List<string>();
    var myClassList = new List<MyClass>();

    6.1.4 代码的拓展

    在不同的特定类型实例化泛型时,会创建多少代码?因为泛型类的定义会放在程序集中,所以用特定类型实例化泛型类不会在IL代码中赋值这些类。但是,在JIT编译器把泛型类编译为本地代码时,会给每个值类型创建一个新类。引用类型共享同一个本地类的所有相同的实现代码。这是因为引用类型在实例化的泛型类中只需要4个字节的内存地址(32位系统),就可以引用一个引用类型。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存的要求都不通,所以要为每个值类型实例化一个新类。

    (看不懂)

    6.1.5 命名约定

    泛型类型的名称用字母T作为前缀 public class List<T> () 

    如果没有特殊的要求,泛型类型允许用任意类替代,且只使用了一个泛型类型,就可以用字符T作为泛型类型的名称 public class LinkedList<T> 

    如果泛型类型有特定的要求(例如,它必须实现一个接口或派生自基类,或者使用了两个或多个泛型类型),就应该给泛型类型使用描述性的名称

    public class SortedList<TKey, TValue>()

    6.2 创建泛型类

    每个处理对象类型的类都可以有泛型实现方式,这样有利于消除类型强制转换操作

    6.3 泛型类的功能

  • 相关阅读:
    android 属性动画
    android EventBus
    android gson使用
    Date、String、Calendar类型之间的转化
    2020-08-26:裸写算法:树的非递归先序遍历。
    2020-08-25:BloomFilter的原理以及Zset的实现原理。
    2020-08-24:什么是小文件?很多小文件会有什么问题?很多小文件怎么解决?(大数据)
    2020-08-23:描述HTTPS和HTTP的区别。
    2020-08-22:I/O多路复用中select/poll/epoll的区别?
    2020-08-21:网络IO模型有哪些?
  • 原文地址:https://www.cnblogs.com/code1992/p/10057602.html
Copyright © 2011-2022 走看看