CLR 要求每个类型最终都要继承自 System.Object 类型

 //隐式继承 Object
class Employee {
...
} //显示继承继承 Object
class Employee : System.Object {
...
}

类型定义(C#)描述

System.object 的公有方法

Equals:如果两个对象具有相同的值,方法返回 true

GetHashCode:方法返回对象的值的散列码。如果一个对象被用作散列表的一个键值,那么该对象的类型应该重写 GetHashCode().

ToString:重写该方法使其返回一个表示对象状态的字符串

GetType:方法返回一个类型为继承自Type的对象实例,其标识了该方法所属对象的类型。返回的 Type 对象可以和反射类一起使用来获得类型的元数据信息。(* GetType 方法是一个非虚方法,这可以防止一个类通过重写该方法而隐藏它的类型,从而破坏类型安全)

System.object 的受保护方法

MemberwiseClone:非虚方法,它创建一个新的实例,并将其字段设置为和this对象的字段相同,最后返回新创建的实例引用。关于该方法的更多信息,请参见

Finalize:虚方法,当垃圾收集器判定某个对象为可回收的垃圾时,垃圾收集器会在对象内存被回收前调用此方法。那些内存回收时需要资源清理的类型应该重写该方法。

CLR 要求所有的对象都要用 new 操作符来创建(产生 newobj IL 指令)。下面的语句展示了怎样创建一个 Employee 对象:

Employee e = new Employee("ConstructorParaml");

下面是 new 操作符所执行的工作:

  1. 从托管堆(managcd heap)中分配中分配指定类型所需的字节来作为存储其对象的内存空间。
  2. 初始化对象的附加成员(overhead members)。每个对象实例都有两个附加成员(管理对象实例)① 指向类型方法表的指针② SyncBlockIndex
  3. 传入 new 操作符中的指定参数(上面例子为"ConstructorParaml"),调用类型的实例构造器,虽然大多数语言在编译构造器是都会要求它们调用基类型中相应的构造器,但CLR本身没有这样的要求

在 new 完成了这些所有操作后,它将返回一个指向新创建对象的引用。在上面的例子中,该引用被保存在变量 e 中,其类型为 Employee。

没有和 new 操作符对应的 delete 操作符。也就是说,在CLR中,我们无法显示释放对象所占用的资源。CLR 引入一种垃圾收集环境来自动检测哪些不再被使用或访问的对象,并自动释放它们的内存。

类型与通用语言运行时:System.Object的更多相关文章

  1. c#通用语言运行时CLR

  2. 动态语言运行时(DLR)

    前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...

  3. 承载(Host)通用语言执行时

    承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...

  4. 第4章 类型基础 -- 4.1 所有类型都从System.Object派生

    4.1 所有类型都从System.Object派生 “运行时”要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证 ...

  5. Dapr 知多少 | 分布式应用运行时

    Intro Dapr 官方团队已于最近(2021.1.17)正式发布Dapr v1.0,Dapr已正式生产可用,可以部署到自托管环境或 Kubernetes 集群.对于绝大多数开发者来说,想必对Dap ...

  6. 4.1 所有类型都从 System.Object 派生

    "运行时"要求各个类型最终都从 System.Object 派生.(显示继承/隐式继承) 提供公共方法(public): Equals 判断两个对象相等,true 表示相等. Ge ...

  7. Java运行时,各种类型存储介绍

    Java的内存分配   Java程序运行时的内存结构分成:方法区.栈内存.堆内存.本地方法栈几种.    方法区    存放装载的类数据信息,包括:基本信息:每个类的全限定名.每个类的直接超类的全限定 ...

  8. NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”

    几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...

  9. 无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。

    在一个项目中使用LINQ和EF时出现了题目所示的异常,搜索了很多资料都找不到解决办法,主要是因为EF方面的知识欠缺. 先将情况记录如下,以供以后参考. 查询主要设计两张表,由外键关联: 在进行下面的查 ...

随机推荐

  1. [POJ2084]Game of Connections

      Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7888   Accepted: 3965 Description Thi ...

  2. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

  3. 《Introduction to Algorithm》-chaper30-多项式与快速傅里叶变换

    两个n次多项式的相加最直接的方法所需要的时间是O(n),而实现两个n次多项式的乘法的直接方法则需要O(n^2),本章讨论的快速傅里叶变换(FFT),将会将这一过程的时间复杂度降至O(nlogn).同时 ...

  4. Pascal <-> C/C++ 转换简明教程

    在OI的学习中,阅读多种语言的能力是很重要的. 本文就着眼于让大家最快地掌握这两种语言间的转换方法. 程序主结构 C/C++ Pascal 主程序(即开始执行的程序段)和其他函数.过程本质上都属于函数 ...

  5. ssh-copy-id password

  6. oracle中exp,imp的使用详解

    http://www.cnblogs.com/yugen/archive/2010/07/25/1784763.html

  7. eclipse老是卡在Refreshing workspace

    最近老是遇到eclipse没有响应,参考网络上的相关帖子做了些优化,但问题依旧. 后来发现出现这个问题一般都是eclipse无响应,直接结束进程后导致的,看了下eclipse日志,果真如此. !SES ...

  8. ServletContext获取项目真实路径

    import javax.servlet.ServletContext; import org.springframework.web.context.ServletContextAware; /** ...

  9. C#- Winform最小化到托盘

    实现前先拉一个notifyIcon控件,在Icon属性中加入一个ICON小图标,然后具体的代码实现如下: using System; using System.Collections.Generic; ...

  10. 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件

    最近一直在学习SSM框架,今天遇到一个关于MyBatis生成的问题,记录一下. http://blog.csdn.net/zhshulin/article/details/37956105 我是根据这 ...