每个应用程序都要使用这样或者那样的资源,比如文件.内存缓冲区.屏幕空间.网络连接.数据库资源等.事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源. 要使用这些资源,必须为代表资源的类型分配内存.   访问一个资源所需的具体步骤如下: #1,调用IL指令newobj, 为代表资源的类型分配内存.C#中使用new操作符,编译器就会自动生成该指令. #2,初始化内存,设置资源的初始状态,使资源可用.类型的实例构造器负责设置该初始状态. #3,访问类型的成员(可根据需要反复)来使用资源.…
目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象清理资源 使用实现了Dispose模式的类型 C#的using语句 手动监视和控制对象的生存期 对象复活 代 线程劫持 大对象 一.理解垃圾回收平台的基本工作原理 值类型(含所有枚举类型).集合类型.String.Attribute.Delegate和Event所代表的资源无需执行特殊的清理操作.…
编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1;   等价于: int a = 1; 这种语法不仅增强了代码的可读性,其生成的IL代码与使用System.Int32时生成的IL代码是完全一致的.   编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到Framework类库(FCL)中存在的类型.如C#中,i…
面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. 泛型(generic)是CLR和编程语言提供的一种特殊机制,它支持另一种形式的代码重用,即“算法重用”.   简单地说,开发人员先定义好一个算法,比如排序.搜索.交换.比较或转换等.但是,定义算法的开发人员并不设定该算法要操作什么数据类型:该算法可以广泛地应用于不同类型的对象.然后,另一个开发人员只…
写在前言   .Net Framework并不是Win 32 API 和COM上的一个抽象层.   某种程度上,它是自己的操作系统,有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理机制,自己的应用程序隔离边界(AppDomains),自己的线程处理模型等. 随着多核计算机越来越普遍,线程处理,并发执行,并行结构,同步等方面的重要性日益凸显.   CLR的执行模型   公共语言运行时 CLR Common Language Runtime 是一个运行时环境,保证应用和底层操作系…
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里获得直接支持.堆栈指针向下移动,分配新的内存,向上移动,则释放那些内存.Java系统必须知道存储在堆栈内的所有项目的确切的生命周期. 3)堆.编译器不需要知道存储的数据在堆里活多长时间. 4)常量存储.通常直接放在代码内部. 5)非RAM存储,如果数据完全存活与程序之外,那么它可以不受程序的任何控制…
实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, 首先为实例的数据字段分配内存 #2, 然后初始化对象的附加字段(类型对象指针和同步块索引) #3, 最后调用类型的实例构造器来设置对象的初始状态   构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零.构造器没有显示重写的所有字段保证都有一个0或null值.和其它方法不同…
类型基础 所有类型都从System.Object派生   CLR要求所有对象都用new 操作符来创建. Employee e = new Employee("Constructor Parameters");   以下是 new 操作符所做的事情: #1, 计算类型及所有基类型(一直到System.Object, 虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数. 堆上的每个对象还需要一些额外(overhead 开销成员)的成员 -- 即“类型对象指针”(type obj…
事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e);   类型定义事件成员,就可以通知其他对象发生了特定的事情.如果定义一个事件成员,意味着类型要提供一下能力: #1,方法可登记也可注销它对该事件的关注 #2,该事件发生时,登记了的方法会收到通知.   类型之所以能够提供事件通知功能,是因为类型维护了一个已经登记方法的列表.事件发生后,类型将通知列表中所有已登…
一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Undefined.不可能出现OutOfMemeoryError情况. 2.Java虚拟机栈是线程的私有空间,每个线程都有.栈中局部变量表的部分是在编译期间完成分配的,每个局部变量空间的大小为32为长度.栈的深度太长,抛出StackOverflowError异常.栈可扩展时,如果内存不够,会抛出OutOf…