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

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

“运行时”要求每个类型最终都从System.Object类型派生。

由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法。

System.Object类提供了如下表所示的公共实例方法:

表4-1 System.Object的公共方法
Equals 若两个对象具有相同的值,就返回 true 。详情请参考"对象相等性和同一性"
GetHashCode  
返回对象的值的哈希码。如果某个类型的对象要在哈希表集合(比如 Dictionary )中作为键使用,类型应重写该方法。

方法应该为不同的对象提供良好分布(是指针对所有输入,GetHashCode生成的哈希值应该在所有整数中产生一个随机的分布。 --译注)。

将这个方法设计到 Object 中并不恰当。大多数类型永远不会在哈希表中作为键使用:该方法本该在接口中定义。

ToString
默认返回类型的完整名称(this.GetType().FullName)。但经常重写该方法来返回包含对象状态表示的 String 对象。 例如,核心类型(如 Boolean 和 Int32 )重写该方法来返回它们的值的字符串表示。

另外,经常处于调试的目的而重写该方法:调用后获得一个字符串,显示对象各字段的值。事实上,Microsoft Visual Studio的调试器会自动调用该函数来显示对象的字符串表示。

注意,ToString 理论上应察觉与调用线程关联的 CultureInfo 并采取相应行动。 “字符、字符串和文本处理”将更详细地讨论ToString

GetType  
返回从 Type 派生的一个类型的实例,指出调用 GetType 的那个对象是什么类型。

返回的 Type 对象可以和反射类配合,获取与对象的类型有关的元数据信息。反射将在“程序集加载和反射”讨论。

GetType 是非虚方法,目的是防止类重写该方法,隐瞒其类型,进而破坏类型安全性。

此外,从System.Object派生的类型能访问如表4-2所示的受保护方法。

表4-2 System.Object的受保护方法
MemberwiseClone 
这个非虚方法创建类型的新实例,并将新对象的实例字段设与 this 对象的实例字段完全一致。

返回对新实例的引用(作者在这段话里引用了两种不同的“实例”。一种是类的实例,也就是对象;另一种是类中定义的实例字段。

所谓“实例字段”,就是指非静态字段,有时也称为“实例成员”。简单地说,实例成员属于类的对象,静态成员属于类。 --译注)。

Finalize 
在垃圾回收器判断对象应该作为垃圾被回收之后,在对象的内存被实际回收之前,会调用这个虚方法。

需要在回收内存前执行清理工作的类型应重写该方法。

“托管堆和垃圾回收”会更详细地讨论这个重要的方法。

CLR要求所有对象都用 new 操作符创建。以下代码展示了如何创建一个 Employee 对象:

Employee employee = new Employee("ConstructorParam1");

以下是 new 操作符所做的事情:

  1. 计算类型及其所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。堆上每个对象都需要一些额外的成员(称为overhead成员,或者说“开销成员” --译注),包括“类型对象指针”(type object pointer)和“同步块索引”(sync block index)。CLR利用这些成员管理对象。额外成员的字节数要计入对象大小。
  2. 从托管堆中分配累心要求的字节数,从而分配对象的内存,分配的所有字节都设为零(0)。
  3. 初始化对象昂的“类型对象指针”和“同步块索引”成员。
  4. 调用类型的实例构造器,传递在 new  调用中指定的实参(上例就是字符串"ConstructorParam1")。大多数编译器都在构造器中自动生成来调用基类构造器。每个类型的构造器都负责初始化该类型定义的实例字段。最终调用 System.Object 的构造器,该构造器什么都不做,简单地返回。

new 执行了所有这些操作之后,返回指向新建对象的一个引用(或指针)。在前面的示例代码中,该引用保存到变量employee中,后者具有 Employee 类型。

Btw, 没有和 new 操作符对应的 delete 操作符;换言之,没有办法显式释放已为对象分配的内存。CLR采用了垃圾回收机制,能自动检测到一个对象不再被使用或访问,并自动释放对象的内存。

时间: 2024-10-12 22:17:40

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

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

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

第四章 类型基础

1. 概述 本章讲述使用 类型 和 CLR 时需要掌握的一些基础知识. 2. 名词解释 3. 主要内容 3.1 所有类型都从System.Object 派生 所有对象都用new操作符来创建,步骤如下: ① 计算类型及其所有基类型中定义的实例字段需要的字节数.包括两个额外成员:类型对象指针 和 同步块索引. ② 从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零(0). ③ 初始化对象的 类型对象指针 和 同步块索引. ④ 调用类型的实例构造器,向其传入在对new的调用

NET CLR via C#(第4版)第4章 类型基础

本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系 本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一组基本行为. 讨论类型安全性.命名空间.程序集.以及如何将对象从一种类型转换成另一种类型. 本章最后会解释类型.对象.线程栈和托管堆在运行时的相互关系. 4.1 所有类型都从System.Object派生 CLR要求每个类型最终都从System.Object类型派生.从而确保类每个对象都具备一组最基本的

【C#进阶系列】04 类型基础

关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后,新方法才会返回其值的字符串表示. 其中还有两个受保护的方法: MemberwiseClone:深复制. Finalize:在垃圾回收器判断此对象应该被回收后,在对象的内存被实际回收前会调用此方法. 关于类型判断和转换: 用is来判断对象为某类型或者某类型的派生类,是为true,不是为false.

02_类型基础

CLR要求每个类型最终都从system.Object类型派生, 所有的类型最终都从system.Object派生,所以每个类型的每个对象都有一组最基本的方法, 如:Equals,判断两个对象值是否相同,相同返回true,否则返回false. GetHashCode:返回对象的值得一个哈希码. ToString():默认返回类型的完整名称. GetType():返回从Type派生的一个对象的实例.指出调用GetType的那个对象是什么类型. System.Object 受保护方法: Memberw

NET基础(1):类型基础

所有类型都从System.Object 派生,‘运行时’要求每个类型都从System.Object类派生,也就是说,以下两个类型定义完全一致: //隐式派生字Object class Employee { do something..... } //显式派生字Object class Employee:System.Object { do something..... } 由于所有类型最终都是从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法,System.Obje

04.类型基础

所有类型都从System.Object派生 Object类型的公开方法 Equals.GetHashCode.GetType.ToString Object类型的受保护方法 MembervieseClone.Finalize new操作符所做的事情 1.它计算类型和它的所有基类中定义所有字段需要的字节数 2.它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零 3.初始化对象的成员 4.调用类型的构造函数 5.返回新建对象的引用 类型转换 CLR允许将一个对象转换成它

第04章-VTK基础(5)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第63页至第70页] 4.11 文本标注 VTK提供了两种方法用于标注图像

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为