第81页到第98页

又有两三天没有认真地看书了,今天是个阳关灿烂的周日,心情大好,我喜欢。

System.Object是作为所有CLR类的基类,所以所有的类型都具有几个基础的方法。其中GetHashCode返回一个hash值,该值在底层是哈希结构的数据结构中很有用处,比如哈希表,但是并非所有的对象都会被用作哈希表的key,所以作者认为GetHashCode不应该放到object类中被所有的类型继承,应该放到某个接口中。这种观点是正确的,是更为优化的。当然,放到object里除了增加了内存消耗,其他也没什么坏处。

GetType方法是非虚方法,该方法可以使得子类不能重写它,从而篡改自己的类型,这显然是为了CLR服务的。

还有一个非虚方法memberwiseclone,这是一个浅拷贝。

Finalize方法是虚方法,这个方法是为垃圾回收服务的,CLR调用垃圾回收的时候,如果确定了回收什么object,会在回收前调用这个object的Finalize方法。

1.      当调用new的时候,CLR第一步是为这个要新建的object计算它所需要的内容空间。该内存空间由两部分组成,第一部分是typeinstance member,就是这个类型以及它所有的基类所定义的实例字段。第二部分是overhead member,是一些CLR为object自动添加的member,e.g.type pointer,sync block index。

2.      Object是放在托管堆上的,object在内存分配的时候,会自动把所有的字节都设置为0.

3.      会优先初始化overhead member,

4.      递归调用类以及基类的构造函数初始化instance member

如果object是null,那么调用objectis,返回的总是false

Is和as的性能区别是,as用null判断取代了类型检查,所以性能得到了提高。

命名空间是C# 层面的语言特性,由C#的编译器提供支持,这样的特性对于CLR来说完全透明,CLR完全用不到这样的特性。

CLR之所以要检查类型安全,是因为它是解释执行的,在解释的过程中它需要先check下类型安全的,如果有编译的过程,编译器自动会帮助检查。

Using指令的另一种形式是为类型或者命名空间创造别名。

C#提供一种名叫外部别名的引用具体类型的方式,这种方式针对的场景比较特殊,我没有具体去看,不过想来大概是能够通过更具体地指定引用的名字空间,从而可以解决极其特殊的名字冲突。

重新温习了下栈的相关知识,在函数调用的时候,线程栈会压入一个stackframe,并将实参和returnaddress压入栈,再然后压入localvariable。

Overhead members contains one for base type object pointer.

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值