前言
这里说得object是C#语言中的类型object,也是Framework中的System.Object(两者是一个意思)。如其名“面向对象编程”对象就是Object。既然提到面向对象,自然就想到其三大特性:封装、继承、多态。
object其实就一个类
这个最直接的体现就是在visual studio中选中object 关键字然后查看定义(F12),如下图:
object是一个类,他被封装为System.Object。
原来,object就和我们平常写的普通类是没什么区别:构造函数、析构函数、几个静态方法、几个虚方法、GetType、克隆(浅复制)。
正是有了这些静态方法:
A 有了Equals, 所以我们在平时编程的时候 可以直接用object.Equals 去按值比较两个对象
B 有的ReferenceEquals,所以可以直接使用object.ReferenceEquals去按引用地址比较两个对象
正是有了这些虚方法:
A Equals,所以object对象可以自己去复写判断逻辑
B GetHasCode 同理,故:略
C Tostring 同理,故:略
引入话题:object的三个Equals比较方法
public static bool Equals(Object objA, Object objB);
public static bool ReferenceEquals(Object objA, Object objB);
public virtual bool Equals(Object obj);
静态方法是提供object的默认比较算法。主要是用于值类型和引用类型比较。这里涉及到另一个知识点:引用类型 和 值类型,这个知识点我接下来的文章会详细分析。Equals这个虚方法为子类提供复写判断算法的途径。
是类,也是一切类型的基类
在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从Object继承的。
1、从上面截图可以看出一个提外信息:object=System.Object
2、我们平时定义一个类时候,并没有显示写出 XXX:object,这个是由.net framework自动帮我们完成的。
3、一个疑问:所有类直接或简洁继承于Object。如上图例子,是否Parent 继承于object 而Child有继承于Parent,所以Child不会直接继承于Object,而是间接通过Parent来继承。如果Child不继承与Parent而是一个单独的类,那么Child类就会直接继承于Object?
在来一张图:
因为继承,所以既是没用其他代码,任何类在没有实例化对象之前也可访问来自继承于Object的静态方法。示例话之后就能访问其非静态方法了。
其他零星知识点或经验
1、object是一切类型的基类,所以在程序中我们有时会用object作为方法参数来传递一些复杂、动态、未知的参数。
2、所用object作为数值或者方法类型时候,会涉及到多次的装箱、拆箱。这样的代码效率底而且不安全,所以后面有.Net Framework 提供了泛型可以更高效便捷来处理这个问题
3、所有类有直接或间接继承于System.Object;所有值类型都隐士继承于System.ValueType,而System.ValueType是一个类,故而也继承了System.Object.
4、一个坑:众所周知C#有两个数据类型(值类型和引用类型),他们都属于类。值类型即System.ValueType,所有的具体的值类型种类都继承与她,如int,float 等。所有,对于代码 int 可以访问object基类的静态方法 Equals,以及int 的变量,可以访问基类的方法(因为基类方法是虚方法,在int定义时候以及复写了所有来及基类的方法)。如上理解是通的,我猜也是争取的。但是!F12 看源代码就看不出这层意思,一切都被.net framework 或CLR 特殊处理了。如下图看看int的方法签名吧:
int 其实就是一个struct ,而struct是如何,取不能查看其定义。所有这里只能被动的接受微软的理论知识了
回归主题,总是object就是一个类,也是其他一切类型的基类。他体现了面向对象的三大特性。