又有两三天没有认真地看书了,今天是个阳关灿烂的周日,心情大好,我喜欢。
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.