再回首:object是什么

前言

  这里说得object是C#语言中的类型object,也是Framework中的System.Object(二者是一个意思)。如其名“面向对象编程”对象就是Object。既然提到面向对象,天然就想到其三大特性:封装、继承、多态。算法

 

object其实就一个类

  这个最直接的体现就是在visual studio中选中object 关键字而后查看定义(F12),以下图:编程

 object是一个类,他被封装为System.Object。安全

原来,object就和咱们日常写的普通类是没什么区别:构造函数、析构函数、几个静态方法、几个虚方法、GetType、克隆(浅复制)。函数

正是有了这些静态方法:spa

     A 有了Equals, 因此咱们在平时编程的时候 能够直接用object.Equals 去按值比较两个对象.net

     B 有的ReferenceEquals,因此能够直接使用object.ReferenceEquals去按引用地址比较两个对象3d

正是有了这些虚方法:对象

   A Equals,因此object对象能够本身去复写判断逻辑blog

     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继承的。

 一、从上面截图能够看出一个提外信息:object=System.Object

 二、咱们平时定义一个类时候,并无显示写出 XXX:object,这个是由.net framework自动帮咱们完成的。

 三、一个疑问:全部类直接或简洁继承于Object。如上图例子,是否Parent 继承于object 而Child有继承于Parent,因此Child不会直接继承于Object,而是间接经过Parent来继承。若是Child不继承与Parent而是一个单独的类,那么Child类就会直接继承于Object?

 

在来一张图:

 

由于继承,因此既是没用其余代码,任何类在没有实例化对象以前也可访问来自继承于Object的静态方法。示例话以后就能访问其非静态方法了。

 

 

其余零星知识点或经验

一、object是一切类型的基类,因此在程序中咱们有时会用object做为方法参数来传递一些复杂、动态、未知的参数。

二、所用object做为数值或者方法类型时候,会涉及到屡次的装箱、拆箱。这样的代码效率底并且不安全,因此后面有.Net Framework 提供了泛型能够更高效便捷来处理这个问题

三、全部类有直接或间接继承于System.Object;全部值类型都隐士继承于System.ValueType,而System.ValueType是一个类,故而也继承了System.Object.

四、一个坑:众所周知C#有两个数据类型(值类型和引用类型),他们都属于类。值类型即System.ValueType,全部的具体的值类型种类都继承与她,如int,float 等。全部,对于代码 int 能够访问object基类的静态方法 Equals,以及int 的变量,能够访问基类的方法(由于基类方法是虚方法,在int定义时候以及复写了全部来及基类的方法)。如上理解是通的,我猜也是争取的。可是!F12 看源代码就看不出这层意思,一切都被.net framework 或CLR 特殊处理了。以下图看看int的方法签名吧:

int 其实就是一个struct ,而struct是如何,取不能查看其定义。全部这里只能被动的接受微软的理论知识了

回归主题,老是object就是一个类,也是其余一切类型的基类。他体现了面向对象的三大特性。

相关文章
相关标签/搜索