摘要:
问:当我们new一个对象时,会发生什么事?答:调用该类型的构造函数。问题看似简单,不过事实上,CLR做的比这要多。。。要准确回答这个问题,还要分情况来说。new一个引用类型首先,要实例化一个引用类型,就一定需要在堆上分配内存。要分配内存,就需要先计算出这个引用类型占多大空间,需要给它分配多少内存。那怎么计算呢?简单!只要计算该类型所有字段的长度总和就可以啦。我们知道,引用类型的字段,占一个指针的长度(32位机器上是4个字节,64位机器上是8个字节)。值类型的字段长度可以通过递归的方法计算得出(递归终点是遇到引用类型或基本类型)。根据这些信息,我们就可以轻松计算出所有字段长度的总和了。但是实际上 阅读全文
posted @ 2013-02-11 16:44
东溟海
阅读(530)
评论(0)
推荐(0)
摘要:
前一阵子我参加了一次笔试,其中有一道选择题让我印象深刻,是这样的:实例化一个X类型对象时所执行的顺序:A.调用X类型构造函数,调用X类型基类的构造函数,调用X类型内部字段的构造函数B.调用X类型内部字段的构造函数,调用X类型基类的构造函数,调用X类型构造函数C.调用X类型基类的构造函数,调用X类型构造函数,调用X类型内部字段的构造函数D.调用X类型基类的构造函数,调用X类型内部字段的构造函数,调用X类型构造函数我觉的这道题出得很没水平。在C++的世界里,我会毫不犹豫的选D。但是,由于C#引入了字段初始化器,所以选什么答案完全依赖于类具体是如何设计的。好吧,我们今天就来谈谈C#在类型实例化时都有 阅读全文
posted @ 2013-02-11 16:41
东溟海
阅读(791)
评论(0)
推荐(0)
摘要:
刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例。如下:String s1 = "Hello";String s2 = "Hello"; //s2和s1的实际值都是“Hello”bool same = (object) s1 == (object) s2; //这里比较s1、s2是否引用了同一个对象实例 ... 阅读全文
posted @ 2013-02-11 16:38
东溟海
阅读(277)
评论(0)
推荐(0)
摘要:
先进行细分:类的成员分为:字段、属性、方法、构造方法成员的修饰符:静态成员、实例成员层次结构:父类、子类先不考虑继承关系,执行顺序为:静态字段静态构造方法实例字段实例构造方法属性和方法是在调用的时候才执行,这里就不考虑了。如何理解上面的执行过程?假如让我来设计执行过程,我该如何考虑,依据是什么?首先,静态的东西是大家共享的,也就是相同的。应该先关心共享的东西,再关系个人的东西。“先公后私”,呵呵。其次,实例化之前,应该先初始化自己的内部数据。现在考虑继承关系,执行顺序为:子类的静态字段子类的静态构造方法子类的实例字段父类的静态字段父类的静态构造方法父类的实例字段父类的实例构造方法子类的实例构造 阅读全文
posted @ 2013-02-11 16:23
东溟海
阅读(372)
评论(0)
推荐(1)
摘要:
当 Windows Form 应用程序启动时,会以下列顺序引发主要表单的启动事件: System.Windows.Forms.Control.HandleCreated System.Windows.Forms.Control.BindingContextChanged System.Windows.Forms.Form.Load System.Windows.Forms.Control.VisibleChanged System.Windows.Forms.Form.Activated System.Windows.Forms.Form.Shown 当应用程序关闭时,会以下列顺序引发主要表单 阅读全文
posted @ 2013-02-11 14:03
东溟海
阅读(493)
评论(0)
推荐(0)
浙公网安备 33010602011771号