C#中所有的类型都是从 System.Object 派生而来,也就是所谓的单根继承.不管你是值类型也好,引用类型也好亦或是自定义的类型,全部都是派生自 System.Object.显示指定就是显示派生,不指定也会隐式派生.此基类有几个公共方法,想必大家都已经熟悉并多少用过了.
ToString() 默认返回的是对象的类型全称 : this.GetType().FullName.当然很多时候也会被重写,比如 int.ToString() , XXX.ToString()以显示一些有用的信息.
GetType() 非虚方法,返回对象的类型信息.
Equals() 用来判断对象的一致性,和 == 运算符还是有点区别的.
GetHashCode() 作为哈希表中的Key使用,其实这个方法设计到基类中并不恰当,本应在一个接口当中的.
还有两个受保护的方法:
MemberwiseClone() 创建类型的一个新实例,注意和 Clone() 的区别,深浅拷贝.
Finalize() 垃圾回收之前调用,如果需要进行一些清理工作,可以重写这个方法.
CLR要求所有的对象都使用new操作符来创建.
//对象的内存拷贝,MemberWiseClone() 和 反序列化 的时候貌似没有用到 new 操作符,标记下,回来查个资料瞅瞅.
当然,你可能见过这种创建对象的方式.其实内部也只是用工厂模式封装了下,最基本的一定还是 new 操作.
Entity e = Factory.Create("XXX");
new所做的事情;
1.计算实例化类型所需的字节大小,包括定义的字段(包含父类),一些额外的CLR用于管理对象的成员----类型对象指针 和 同步块索引;
2.从托管堆分配内存并初始化为零;
3.初始化 类型对象指针 和 同步块索引;
4.调用其构造函数.
类型转换.有显示和隐式两种.相关的操作有 as is 操作符,和 (XXXObject)Object 强制转换方法.推荐使用 as. 标准库中也有一些常用的转换方法,在 Convert 中,还有一些解析方法,比如 int.Parse(XXX) 和 int.TryParse(XXX,out XXX),合理使用这些方法是我们编写程序必备的技能之一.
命名空间用来对类型进行逻辑分组,所以同一个命名空间中的内容有可能在一个程序集中,也有可能在其他程序集中.同理,不同的命名空间也可以存在一个相同的程序集中.使用 using 命名空间; 的方式来简化输入代码的数量是我对其最直观的认识.如果有 XXX.YYY.Control 和 XXX.XXX.Control在同一类中使用,也可以使用 using AdvControl = XXX.XXX.Control; 也可以消除类型歧义.
对象生成 动态图解 (待续...)