类型与通用语言运行时:System.Object

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

1 //隐式继承 Object
2 class Employee {
3       ...
4 }
5
6 //显示继承继承 Object
7 class Employee : System.Object {
8       ...
9 }

类型定义(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 引入一种垃圾收集环境来自动检测哪些不再被使用或访问的对象,并自动释放它们的内存。

时间: 2024-10-07 09:23:18

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

类型与通用语言运行时:类型转换

CLR 最重要的一个特性就是类型安全.CLR 在运行时总能知道一个对象的类型.我们也可以用过调用 GetType方法来得到对象的准确类型.因为该方法是一个虚方法.所以我们不可能利用它来篡改一个类型的信息. 例如:我们不可能重写 Employee 类的 GetType方法使之返回一个SpaceShuttle类型. 作为开发人员,我们经常会遇到需要将一个对象转换为其他类型. CLR 允许我们将对象转换为其原来的类型或者它的任何一个基类型.各个编程语言自己决定如何提供这些转型操作. 例如,C# 不需要

承载(Host)通用语言运行时

承载(Host)通用语言运行时(CLR) 另一种使用COM 的方法是是把需要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起,开成自定义的承载通用语言运行时,通用语言运行时就是 C++ 应用程序,且有一些可用的库(.lib)文件,可以在标准的 C++ 应用程序中链接它.承载通用语言运行时的代码要比加载 COM 库的代码稍许复杂一点,但不需要复杂的注册 COM 库了:这个方法还可能以非常细粒度地控制通用语言运行时的行为,虽然,我们会发现默认的行为对于大多数情况已经非常好了:但是,这种方法

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

承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ 应用程序,且有一些可用的库(.lib)文件.能够在标准的 C++ 应用程序中链接它. 承载通用语言执行时的代码要比载入 COM 库的代码稍许复杂一点,但不须要复杂的注冊 COM 库了:这种方法还可能以很细粒度地控制通用语言执行时的行为.尽管.我们会发现默认的行为对于大多数情况已经很好了:可是,这样的

在Win2008R2上安装vCenter6.7出现“系统上未安装通用C运行时。您可以从Microsoft网站上下载并安装”错误的解决办法

准备在一台Win2008R2虚拟机上安装vCenter 6.7,在安装时,弹出“系统上未安装通用C运行时.您可以从Microsoft网站上下载并安装”的错误提示,如下图所示. 进入微软官网“Windows中的Universal C Runtime更新”页面,针对自己的作品系统选择安装更新包. 操作系统更新 所有受支持的基于 x86 的 Windows 8.1 版本立即下载该程序包. 所有受支持的基于 x64 的 Windows 8.1 版本立即下载该程序包. 所有受支持的基于 x64 的 Win

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

4.1 所有类型都从System.Object派生 “运行时”要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法. System.Object类提供了如下表所示的公共实例方法: 表4-1 System.Object的公共方法 Equals 若两个对象具有相同的值,就返回 true .详情请参考"对象相等性和同一性" GetHashCode 返回对象的值的哈希码.如果某个类型的对象要

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

"运行时"要求各个类型最终都从 System.Object 派生.(显示继承/隐式继承) 提供公共方法(public): Equals 判断两个对象相等,true 表示相等. GetHashCode 返回对象的哈希值. ToString 默认返回类型的完整名称(this.GetType().FullName) GetType 返回 Type 派生的一个类型实例,指出对象的类型,返回的 Type 对象可以与反射类配合,获取与对象类型相关的元数据信息.GetType 为非虚方法,防止子类重

共享程序集和强命名程序集(4):“运行时”如何解析类型引用

GAC(Global Assembly Cache) 全局程序集缓存 安装公共语言运行库的每台计算机都有一个称为全局程序集缓存的机器级代码缓存.全局程序集缓存存储专门指定由计算机上的多个应用程序共享的程序集. "运行时"如何解析类型引用 首先是一组毫无营养但是有用的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Reflection; 5 using

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

Java的内存分配   Java程序运行时的内存结构分成:方法区.栈内存.堆内存.本地方法栈几种.    方法区    存放装载的类数据信息,包括:基本信息:每个类的全限定名.每个类的直接超类的全限定名.该类是类还是接口.该类型的访问修饰符.直接超接口的全限定名的有序列表.每个已装载类的详细信息:运行时常量池.字段信息.方法信息.静态变量.到类classloader的引用.到类class的引用.   栈内存     Java栈内存由局部变量区.操作数栈.帧数据区组成,以帧的形式存放本地方法的调用

是否存在不继承自System.Object类型的类

分析问题 可能读者的固有思维认为.NET中所有的类型都必须继承自System.Object,这样的认识过于绝对,且不完全正确.在.NET中,.NET设计小组为中间语言的编译器ILasm.exe添加了noautoinherit开关,当这个开关被打开时,编译器将不会默认年地把类型认为继承自System.Object. 首先介绍一下中间语言的编译工具:ILasm.exe.这是.NET Framework提供的一个编译工具,它的作用是把中间语言(MSIL)编译成可执行的PE文件.该工具非常有用,它不仅使