zoukankan      html  css  js  c++  java
  • 再回首:object是什么

    前言

      这里说得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就是一个类,也是其他一切类型的基类。他体现了面向对象的三大特性。

  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/paulxie/p/7182632.html
Copyright © 2011-2022 走看看