CLR Via C# 读书笔记-第四章 类型基础


  • new()一个类型的步骤
    1. 计算类型及其基类所定义字段和开销成员(类型对象指针、同步块索引)的字节
    2. 托管堆分配需要的字节
    3. 初始化类型对象指针、同步块索引
    4. 最后调用类型实例构造器,传递new的参数

类型转换

  • 通过is进行类型判断、显示转换可以通过(TypeName)转换,但是一般使用as 可以提高性能

命名空间和程序集

  • 命名空间和程序集是不相关的。e.g. System.IO.FileSystem和System.IO.FileSystemWatcher是在不同的程序集实现的

运行时的相互关系

  • 栈帧 代表线程调用栈中一个方法的调用,每调用一个方法都会创建一个栈帧并压入
  • 任何时候在堆上新建对象,都会自动初始化其中的类型对象指针指向类型对象
  • 类型对象上包含类型对象指针同步块索引静态字段方法表等。
  • 这时发现类型对象里面也有类型对象指针,这个指针指向System.Type类型对象,并且Type类型对象得类型对象指针指向自身
  • 调用实例非虚方法时,会找到对应的实例对象的类型对象,如果没有找到对应的方法,将会一直回溯到Object,每个类型对象都有一个字段引用基类型,然后JIT会查找方法的记录项,如果需要就进行编译然后再调用。
  • 调用虚方法时 会生成一些代码,每次调用虚方法都要执行这些代码。这些代码的操作和上面调用非虚方法一样。(但是之前看到过说调用虚方法有性能开销,目前还不清楚为什么?)

上一篇:Windows下安装并设置Redis


下一篇:【LAB4-Cisco】OSPF邻居建立过程与LSDB分析