NET CLR via C#(第4版)第4章 类型基础

本章内容:

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方法返回指向对象的类型对象的指针,这样就可以判断系统中的任何对象的真实类型了。

时间: 2024-10-05 04:10:23

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

python3黑帽子mbp版(第2章:网络基础)

写在最前面的话:很早之前就想学python了,趁着买来了书,打算开始python学习之旅.先说下我的工具:使用的是sublime text3编辑器,主要使用的网站是廖雪峰老师 的网站. 这是tcp客户端 #!/usr/bin/env python3 # -*- code: utf-8 -*- import socket target_host="www.baidu.com" target_port=80 client=socket.socket(socket.AF_INET,socke

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

最近开始仔细研读<CLR.via.C#第三版>这本书.读pdf文档确实很累.建议有条件的朋友还是买书看吧. 我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总结.特别基础的东西不会做过多的阐述. 第一部分讲的是CLR基础. 首先还是重新说下CLR的概念:“CLR 是一个可由多种编程语言使用的“运行时”.可用任何编程语言来开发代码,只要编译器是面向CLR的就可以了”.这里要重新解释下“只要编译器是面向CLR的就可以了”这句话.初学者一般不认同.net平台跨语言,或者

&lt;NET CLR via c# 第4版&gt; 读书笔记--目录

<NET CLR via c# 第4版>个别章节虽读过多次,但始终没有完整读过这本书.即使看过的那些,时间一长,也忘记了大部分.趁着最近不忙,想把这本书好好读一遍,顺便记下笔记,方便随时查看. 真的只是笔记,因为能力有限,并不能很好地讲解一个知识点,只是把我认为比较重要的地方,划个重点,记录到这里.我所追求的,只是尽量别抄错. 所以,如果没看原书,只看这里的话,会比较晕. 目录: <NET CLR via c# 第4版>笔记 第5章 基元类型.引用类型和值类型 <NET CL

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

终于讲到泛型了.当初看到这个书名,最想看的就是作者对泛型,委托,反射这些概念的理解.很多人对泛型的理解停留在泛型集合上,刚开始我也是,随着项目越做越多,对待泛型的认识也越来越深刻. 泛型的概念:泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行. 泛型的优势:源代码保护.类型安全.更加清晰的代码.更佳的性能. 原理:(关键字:开放类型,封闭类型)所有带泛型参数的类型都是一个开放式类型,它不能被实例化(类似接口),在具体使用时生成封闭类型(实际数据类型). 泛型

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

C++ Primer Plus 第六版 第16章 string类和标准模板库

1.string实际上是模板具体化basic_string<char> 的一个typedef,有默认参数,所以省略了初始化参数 2.size_type是一个依赖于实现的整形 string将string::npos定义为字符串的最大长度 3.string类的构造函数P656 4.对于c-风格字符串,3种输入方法:cin>>   cin.getline(),cin.get 对于string   ,2种输入方法:cin>>,getline(cin,string对象) 5.st

Java 线程第三版 第六章 高级同步议题 读书笔记

多线程数据同步错误比较难检测,因为通常是与事件的特定发生顺序有关. 一.同步术语 Barrier(屏障) barrier是多个Thread的集合点:所有的Thread都应该到齐在这个barrier之后才能允许它们继续下去. Condition variable(条件变量) 实际上不是变量,而是与某个lock有关联的变量. Event variable(事件变量) 条件变量的另一个名称. Critical section(临界区) 临界区是synchronized方法或者block. Lock(锁

c++ primer plus(第6版)中文版 第九章编程练习答案

首先,说明下环境: linux:fedora14: IDE:eclipse: python:python2.7 python框架:django web服务器:apache web服务器的python模块:mod_wsgi 写在前面: 之前用的windows下面的xampp,写的php后台,现在想转向linux下面的python,跟以前一样,选择apache和eclipse作为自己的开发工具. eclipse的python配置, 参见之前的博客:http://blog.csdn.net/zy416

Java 线程第三版 第三章数据同步 读书笔记

多线程间共享数据问题 一.Synchronized关键字 atomic一词与"原子"无关,它曾经被认为是物质的最小的单元,不能再被拆解成更小的部分. 当一个方法被声明成synchronized,要执行此方法的thread必须先取得一个token,我们将它称为锁.一旦该方法取得(或者说是获得)锁,它将运行此方法然后释放掉(或者返回)此锁.不管方法时怎样返回的(包括通过异常)该锁会被释放. 二.Volatile关键字 如果变量被标示为volatile,每次使用该变量时都必须从主寄存器中读出