第四章类型基础 CLR学习第四课 狼

一、任何类,都继承或者间接继承自object类,其实万类之源。所以任何类都具有object类的属性和方法。equals、GetHashCode、ToString、GetType、MemberwiseClone、Finalize方法。

二、当我们实例化一个类时,将从托管堆中,分配该类型所需要的空间;然后初始化对象成员,没一个实例化对象都有2个附件成员,第一个成员为指向类型方法的指针;第二个成员(SyncBlockindex),该字段用于线程同步,其中的某些位还用于垃圾处理时的标记;另外object的默认类型GetHashCode方法也用到了改字段。CLR使用这2个字段来管理对象实例。

三、A--B:A--C:B;B继承自A,C继承自B。如果实例化C,将先执行C的初始化,然后发现其应用了B,所以就执行B类,B开始初始化,其初始化发现其引用了A就开始A的初始化,然后A开始执行static函数,和构成函数--然后B执行static函数和构成函数,最后才是C的static函数和构造函数。

四、类型转换is、as:在进行类型转换时as的效率高于is;如果某个方法接收一个object类型的参数,然后把该参数转换为某个类型;此时如果我们把一个时间作为参数传递给该方法,在编译时不会提示错误。但在运行时,会执行方法中的代码,就把一个datetime的类型强制转换为某个类型(clr在运行时检查类型安全)。必然导出错误抛出System。InvalidCastException的异常错误。

as:把某个类型转换为指定的类型,转换成功则返回该类型。转换失败则返回null;如(bool b=o  as object)。

is:判断某个实体类是否为指定类型,如果是在进行强制转换,然后再;如(o is object 如果是在进行转换 object = (object)o ,这就导致了2次检查类型兼容)。

类型转换:只能从子类转换到父类。不能从父类转换到子类,因为子类有的父类不一定有,如果转换会导致,类型、方法等丢失,不安全。

五、clr不认识命名空间;命名空间加上类名才是完整的类名,我们在用代码中using后,在后面就可以直接调用该命名空间下的类,其实是编译器为我们 在检查没一个类型时,安装using 的顺序,一个一个的检查某个类是否在该命名空间下(应该说是否在这个路径下(当然是没有这个说法的,自己的理解,命名空间相当于一种虚拟路径))。如果不在检查下一个命名空间。如果都找不到提示错误。

六:MSCorLib(多语言标准通用对象运行时库:Multilanguage Standard  Common Object Runtime library,这个名字是由ECMA给的,其实微软给的原名是:Micsoft Common Object Runtime Library;你是否认为是微软核心类库缩写呢?哈哈);该类库在.NET程序运行时自动加载,包含了.NET FCL 核心类库。

七:用using 解决多个命名空间下类名相同的情况,及使用别名,类只能定义在命名空间下,命名空间可以嵌套,类也可以嵌套。

八、命名空间和程序集不是一个概念:一个命名空间下可以有多个程序集的程序。一个程序集下可以有多个命名空间的代码。

原文地址:https://www.cnblogs.com/gowhy/p/2006806.html