CLR Via C# Second Edition---1

  接触C#一年多了,虽然学了点东西,但总觉得是支离破碎的,好多东西当初看了,过段时间就忘记,又没什么机会加以实践。于是选择在这里有空写写博客。第一次撰写,只是为了能与园子里的朋友一起分享交流,brainstorming一下,很多也许一时无法理解的东西,就能迎刃而解了。好了,废话不多说,进入正题。

  本书并没有直接从第一章看起,主要很多编程的概念早在学习C++的时候就了解了。所以,就跳着看了。

  这次看的是Type Fundamentals。第一节,All types are derived from System.Object。Object类提供了Equals(),GetHashcode(),GetType()和ToString()实例方法,分别用于判断两个object是不是有same value(而不是引用);获取哈希码,除非要将一个object用作哈希表的key值,不然不需要重写它;反射对应object的类型,获取对应信息;将类型的fullname输出成string,可以重写,用于debug。还有两个protected的方法,MemberwiseClone()和Finalize(),用于复制一个新对象(新的引用,与原对象分离)和用于在GC回收资源的时候调用。

  The new operator.过程:1.计算一个object所有实例字段所需要的字节值,包括他的基类和Object类,包含type object pointer和sync block index,额外的成员字节值会被一起添加到这个object的容量中。2.CLR按照分配的字节值从托管堆中分配内存空间,最后把这些bytes设为0。3.初始化type object pointer和sync block index。4.调用每个类的constructor,从子类层层往上,最后到Object类。没有delete关键字,一切由CLR负责垃圾回收。

  第二节,Casting Between Types。这里作者说了很多,形象的描述了类型转换机制和目的。不过,其实两句话就可以概括。类型转换,就是有类型集成的类可以从子类转换成父类,反之则会出现运行时错误(Runtime Error),牢记,这里不会出现编译时错误(CompileTimeError)。

  第三节,Casting with C# is and as operators。这两个关键字很好理解,is检查类型是否相等或者是否是其子类,是为true,否为false,这里CLR会进行一次类型继承关系的由下至上的遍历;as功能相同,只不过返回一个对应的需要转换的类型或者null,并且速度优于通过is关键词和if else语句写成的类型转换逻辑。

  第四节,namespaces and assemblies。为了封装每个类并且让他们有一个比较清晰的逻辑记忆模式,将他们放进一个有关系的namespace和assemblies。感觉像java里的packege,虽然我没学过java。

  第五节,How things relate at run time。这里用一段小小的代码来说明。

  

void M3()
{
Employee e;
int year;
e=new Manager();
    e=Employee.Lookup("joe");
    year=e.GetYearsEmployed();
    e.GetProgressReport();
}

是这样的。Manager继承自Employee,Lookup()函数是Employee的一个静态函数,执行时运行JIT Code,GetYearsEmployed()是一个非虚实例函数,而GetProgressReport是一个virtural实例函数。然后在内存是这样的,e和year在thread statck中,当执行到new Manager()的时候,托管堆创建一个Manager实例,当Lookup()调用后,创建另一个Manager实例(因为Joe是一个Manager),两个实例是不一样的,当第二个创建完后,引用e就指向第二个Manager实例,而第一个就即将销毁,至于何时,由CLR决定。

然后是e.GetYearsEmpoyed(),因为是非虚函数,所以CLR会将e先变成Employee类型去调用,如果Employee没有定义这个函数的话,就会一直往上,直到Object类。

接着是e.GetProgressReport(),因为是virtural函数,所以会从根据具体类型,找到对应类里的override后的实例函数,运行JIT Code。当然,如果没有定义在子类里面,还是会往基类里面走。

最后,每个内存堆里面还维护了两个刚才提到的type object pointer和sync block index。其实,每个Employee和Manager,还是各种类都是System.Type类型的实例,所以,内存堆里还有个Type类型实例存在,Manager和Employee的type object pointer 都指向Type里面的type object pointer,而Type自己指向自己,这也就是为什么System.Object里面的GetType()函数可以准确的定位一个类型,因为有对应的type object pointer存在,他保存了一个类型对象的地址。

  看得是原版书,就直接这么写了。自知写的不是很好,只是把很多自己已经明白的都写出来了。欢迎拍砖。

posted @ 2011-09-06 00:07  RyanZhu  阅读(521)  评论(0编辑  收藏  举报