本章内容:
1 所有类型都从System.Object派生
2 类型转换
3 命名空间和程序集
4 运行时的相互关系
 
本章讲述使用类型和CLR时需掌握的基础知识。具体地说,要讨论所有类型都具有的一组基本行为。
讨论类型安全性、命名空间、程序集、以及如何将对象从一种类型转换成另一种类型。
本章最后会解释类型、对象、线程栈和托管堆在运行时的相互关系。
 
4.1 所有类型都从System.Object派生
CLR要求每个类型最终都从System.Object类型派生。从而确保类每个对象都具备一组最基本的方法。
[公开方法]
Equals
GetHashCode
ToString
GetType
[受保护方法]
MemberwiseClone
Finalize
 
CLR要求所有对象都用new操作符创建。
以下new操作符所做的事情:
1 计算类型及其所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。堆上每个对象都需要一些额外的成员,包括“类型对象指针”和“同步块索引”。CLR利用这些成员管理对象。额外成员的字节数要计入对象大小。
2 从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0。
3 初始化对象的“类型对象指针”和“同步块索引”成员。
4 调用类型的实例构造器,传递在new调用中指定的实参。大多数编译器都在构造器中自动生成代码来调用基类构造器。每个类型的构造器都负责初始化该类型定义的实例字段。最终调用System.Object的构造器,该构造器什么都不做,简单地返回。
 
new执行了所有这些操作之后,返回指向新建对象的一个引用(或指针)。
并且没有和new操作符对应的delete操作符;换言之,没有办法显式释放为对象分配的内存。CLR采用了垃圾回收机制,自动检测一个对象不再被使用或是访问,并自动释放该对象的内存。
 
4.2 类型转换
CLR最重要的特性之一就是类型安全。在运行时,CLR总是知道对象的类型是什么。调用GetType方法即可。
 
CLR允许将对象转换为它的(实际)类型或者它的任何基类型。
C#不要求任何特殊语法即可讲对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换;然而,将对象转换为它的某个派生类型时,C#要求开发人员只能进行显式转换,因为这种转换可能在运行时失败。
 
使用C#的is和as操作符来转型
is检查对象是否兼容于指定类型,返回Boolean值,is操作符永远不抛出异常;
CLR的类型检查增强了安全性,但无疑会对性能造成一定影响。这是因为CLR首先必须判断变量引用的对象的实际类型,然后,CLR必须遍历继承层次结构,用每个基类型去核对指定的类型。
由于这是一个相当常用的编程模式,所以C#专门提供了as操作符,目的是简化这种代码的写法,同时提升性能。CLR核实一个对象是否兼容与一种类型,如果是,as返回同一个对象的非null引用,如果不兼容,as返回null。注意:as操作符只校验一次对象类型。
 
C#允许类型定义转换操作符方法,详情参见8.5节 “转换操作符方法”。
 
4.3 命名空间和程序集
命名空间 对相关的类型进行逻辑分组,开发人员可以通过命名空间方便定位类型。
 
对于编译器,命名空间的作用就是为类型名称附件以句号分割的符号,使名称变得更长,更可能具有唯一性。
 
CLR对“命名空间”一无所知。
C# using指令的另一种形式允许为类型或命名空间创建别名。
 
命名空间和程序集的关系
注意,命名空间和程序集(实现类型的文件)不一定相关。特别是,同一个名空间中的类型可能在不同程序集中实现,同一个程序集也可能包含不同命名空间中的类型。
在文档中查找类型时,文档会明确指出类型所属的命名空间,以及实现了该类型的程序集。
 
4.4 运行时的相互关系
本节将解释类型、对象、线程栈和托管堆在运行时的相互关系。
此外,还将解释调用静态方法、实例方法和虚方法的区别。
 
“序幕”(prologue)代码:在方法开始做工作前对其进行初始化;
“尾声”(epilogue)代码:在方法做完工作后对其进行清理,以便返回至调用者。
 
堆上所有对象都包含两个额外成员:类型对象指针 和 同步块索引。
 
对象含有一个指针指向对象的类型对象(类型对象中包含静态字段表和方法表)。
 
CLR创建类型对象时,必须初始化这些成员。CLR开始在一个进程中运行时,会立即为MSCorLib.dll中定义的System.Type类型创建一个特殊的类型对象。Employee和Manager类型对象都是该类型的“实例”。因此,它们的类型对象指针成员会初始化成对System.Type类型对象的引用。当然,System.Type类型对象本身也是对象,内部也有“类型对象指针”成员。这个指针指向它本身,因为System.Type类型对象本身是一个类型对象的“实例”。这就是CLR的整个类型系统及其工作方式。也就是说,GetType方法返回指向对象的类型对象的指针,这样就可以判断系统中的任何对象的真实类型了。
 
 
 
 

NET CLR via C#(第4版)第4章 类型基础的更多相关文章

  1. 《CLR via C#(第4版)》【PDF】下载

    <CLR via C#(第4版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382189 via C#(第4版)>[PD ...

  2. 《CLR.via.C#第三版》第一部分读书笔记(一)

    最近开始仔细研读<CLR.via.C#第三版>这本书.读pdf文档确实很累.建议有条件的朋友还是买书看吧. 我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总 ...

  3. <NET CLR via c# 第4版> 读书笔记--目录

    <NET CLR via c# 第4版>个别章节虽读过多次,但始终没有完整读过这本书.即使看过的那些,时间一长,也忘记了大部分.趁着最近不忙,想把这本书好好读一遍,顺便记下笔记,方便随时查 ...

  4. 《CLR.via.C#第三版》第二部分第12章节 泛型 读书笔记(六)

    终于讲到泛型了.当初看到这个书名,最想看的就是作者对泛型,委托,反射这些概念的理解.很多人对泛型的理解停留在泛型集合上,刚开始我也是,随着项目越做越多,对待泛型的认识也越来越深刻. 泛型的概念:泛型是 ...

  5. [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

    原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...

  6. 解读经典《C#高级编程》第七版 Page79-93.对象和类型.Chapter3

    前言 本篇我们继续讲解本章其余的部分:构造函数.只读字段.匿名类型.结构详解.部分类.静态类.Object类.扩展方法,等. 01 类 构造函数 构造函数是一种特殊的方法: 与类同名 没有返回值,甚至 ...

  7. 《C++ Primer》 第四版 第7章 函数

    <C++ Primer> 第四版 第7章 函数 思维导图笔记 超级具体.很具体,图片版,有利于复习查看 http://download.csdn.net/detail/onlyshi/94 ...

  8. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...

  9. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

随机推荐

  1. JAVA虚拟机:Java技术体系讲解(一)

    按照Java系统的功能划分为: 一.Java语言,即使用Java编程语言进行软件开发. 二.开发过程中使用的工具和API(API(Application Programming Interface,应 ...

  2. CentOS7 环境下 在Hadoop集群安装Hive

    1.下载Hive的tar.gz包:http://mirror.bit.edu.cn/apache/hive/ 2.放入CentOS 7 系统中并解压:tar -zxvf apache-hive-2.3 ...

  3. MQTT 协议学习:001-搭建MQTT通信环境,并抓包测试

    背景 目的:了解MQTT 通信的有关概念与流程:方便推算某些数据与文档描述是否一致. 为了能够在保证学习质量的前提下,降低配置环境的门槛,我们将服务器搭建在windwos中,实行内网间的MQTT协议访 ...

  4. HihoCoder第五周:标准动态规划

    这周的题目是最标准最简单的动态规划了,自己一直以来对动态规划都不是很理解,这次也是好好记录一下. 题目1 :数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 ...

  5. Oracle 修改 提交后 回退

    1. -- 查询你执行update 语句之前的数据 精确到什么时间 select * from 表名 as of timestamp to_timestamp('2017-07-21 17:16:38 ...

  6. 基于vue-router的移动端网页的路由管理

    本篇代码示例:github 前提:不关注移动端浏览器的前进事件 涵盖功能: 1,管理路由的历史记录 2,切页动画的实现 3,处理流程类页面的回退事件 描述:    流程类页面的回退事件的解释: 以注册 ...

  7. java虚拟机05(Java虚拟机的参数)

    原文在此 (1)-Xms20M 表示设置堆容量的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置堆容量的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免堆自动扩展. ...

  8. Java集合基于JDK1.8的ArrayList源码分析

    本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组.数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集 ...

  9. DNS and Bind

    DNS  :  工作在应用层 DNS 作用 :  完成域名到IP的解析过程  FQDN --> IP 例如  :  www.ifeng.com  -->  123.103.122.24 D ...

  10. ArcoLinux美化教程

    ArcoLinux美化教程 1. 前言 ArcoLinux已经足够美观,这里主要是讲解如何配置桌面特效 2. 安装compiz $ yay -S compiz 3. 用compiz替换xfwm4 编辑 ...