前言

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

再回首:object是什么的更多相关文章

  1. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  2. 再回首,Java温故知新——开篇说明

    不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...

  3. 再回首UML之下篇

    接着我们上篇博客再回首UML之上篇说,在类图中有四种关系,关联.依赖.泛化.实现,接下来,我们来看看依赖,依赖--描述的是一种使用关系,她说明一个事物的规格说明的变化可能影响到他使用的另一个事物,反之 ...

  4. 再回首UML之上篇

    UML,统一建模语言,是一种用来对真实世界物体进行建模的标准标记,这个建模的过程是开发面向对象设计方法的第一步,UML不是一种方法学,不需要任何正式的工作产品. UML提供多种类型的模型描述图,当在某 ...

  5. UML——再回首

    概述     在画图的过程中,发现自己还是有好多不懂的地方,对于四大关系理解的不是特别透彻,所以画图的过程中总是"剪不断,理还乱!"再一次整理四大关系,再回首必然丰收~~~ 1.实 ...

  6. [二十六]JavaIO之再回首恍然(如梦? 大悟?)

    流分类回顾 本文是JavaIO告一段落的总结帖 希望对JavaIO做一个基础性的总结(不涉及NIO) 从实现的角度进行简单的介绍 下面的这两个表格,之前出现过 数据源形式 InputStream Ou ...

  7. MySQL数据库再回首

    前言: 数据库是程序员的数据源泉,加上近期 要开发DB可视化.性能分析的功能 重新回顾一下MySQL知识,以下是笔记: MySQL架构 MySQL基础理论 1.什么是关系型数据库? 关系型数据库,这个 ...

  8. oracle再回首

    第一章 Oracle 数据库的使用   一. 数据库相关概念   1 什么是数据库 所谓的数据库其实就是数据的集合.用户可以对集合中的数据进行新增.查询.更新. 删除等操作.数据库是以一定方式储存在一 ...

  9. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

随机推荐

  1. linux查看占用内存多的进程

    update一个简单的方法 ps aux | sort -k4nr | head -10 ps -e  -o "%C  : %p : %z : %a"|sort -k5 -nr|h ...

  2. char、varchar、nchar、nvarchar、text的区别

    char.varchar.nchar.nvarchar.text的区别 1.有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar 所谓定长就是长度固定的,当输入的数据长度没有达 ...

  3. 【OCP-12c】CUUG 071题库考试原题及答案解析(16)

    16.(7-5) choose the best answerThe PRODUCTS table has the following structure:Evaluate the following ...

  4. 使用html2canvas截图并用jspdf打印的问题

    之前的方案确实可以打印出a4的大小的pdf,但是也呈现了诸多问题,因为这种方法是截图然后再进行打印的,所以打印出来的效果是模糊的,思前想后决定放弃了这种方式. 最终还是决定使用浏览器自带的打印方法. ...

  5. RHEL配置本地yum

    RHEL(即Red Hat Enterprise Linux的缩写)配置本地yum 提前将 rhel-server-6.7-x86_64-dvd.iso 文件上传到服务器上 1.在根目录创建文件夹/m ...

  6. 读取Properties文件的六种方法

    1.使用java.util.Properties类的load()方法 示例: InputStream in = new BufferedInputStream(new FileInputStream( ...

  7. 集合之六:Map接口

    Map接口概述 Map接口中的集合和Collection接口中的集合在存储数据的格式上有很大的不同,Map接口下的内容是以<K , V> ,键值对的形式存储的,我们查询API,Map接口的 ...

  8. mariadb(mysql)的安装

    1 使用官方源安装mariadb vim /etc/yum.repos.d/MariaDB.repo 添加repo仓库配置内容 [mariadb] name=MariaDB baseurl=http: ...

  9. p1164 小A点菜 题解——背包初步

    传送门 除去花里胡哨的表层题干,其实可以简化为: 若有m个东西,每取一个要K个代价,问若要求取出数据的代价为n的方案数是多少 其实是01背包的一种变式(反正我就是这么认为的,不对又怎样,打我啊). 我 ...

  10. php 前台生成多维数组 后台批量添加

    同一个地方绊倒两次,记录一下哈 1)前台表单,看 name <div class="tab-pane row " id="tab-1" > < ...