第4章 类型基础 -- 4.1 所有类型都从System.Object派生
4.1 所有类型都从System.Object派生
“运行时”要求每个类型最终都从System.Object类型派生。
由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法。
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所示的受保护方法。
| MemberwiseClone |
这个非虚方法创建类型的新实例,并将新对象的实例字段设与 this 对象的实例字段完全一致。 返回对新实例的引用(作者在这段话里引用了两种不同的“实例”。一种是类的实例,也就是对象;另一种是类中定义的实例字段。 所谓“实例字段”,就是指非静态字段,有时也称为“实例成员”。简单地说,实例成员属于类的对象,静态成员属于类。 --译注)。 |
| Finalize |
在垃圾回收器判断对象应该作为垃圾被回收之后,在对象的内存被实际回收之前,会调用这个虚方法。 需要在回收内存前执行清理工作的类型应重写该方法。 “托管堆和垃圾回收”会更详细地讨论这个重要的方法。 |
CLR要求所有对象都用 new 操作符创建。以下代码展示了如何创建一个 Employee 对象:
Employee employee = new Employee("ConstructorParam1");
以下是 new 操作符所做的事情:
- 计算类型及其所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。堆上每个对象都需要一些额外的成员(称为overhead成员,或者说“开销成员” --译注),包括“类型对象指针”(type object pointer)和“同步块索引”(sync block index)。CLR利用这些成员管理对象。额外成员的字节数要计入对象大小。
- 从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零(0)。
- 初始化对象的“类型对象指针”和“同步块索引”成员。
- 调用类型的实例构造器,传递在 new 调用中指定的实参(上例就是字符串"ConstructorParam1")。大多数编译器都在构造器中自动生成来调用基类构造器。每个类型的构造器都负责初始化该类型定义的实例字段。最终调用 System.Object 的构造器,该构造器什么都不做,简单地返回。
new 执行了所有这些操作之后,返回指向新建对象的一个引用(或指针)。在前面的示例代码中,该引用保存到变量employee中,后者具有 Employee 类型。
Btw, 没有和 new 操作符对应的 delete 操作符;换言之,没有办法显式释放已为对象分配的内存。CLR采用了垃圾回收机制,能自动检测到一个对象不再被使用或访问,并自动释放对象的内存。
第4章 类型基础 -- 4.1 所有类型都从System.Object派生的更多相关文章
- 4.1 所有类型都从 System.Object 派生
"运行时"要求各个类型最终都从 System.Object 派生.(显示继承/隐式继承) 提供公共方法(public): Equals 判断两个对象相等,true 表示相等. Ge ...
- *4.1 所有类型都从System.Object派生
- NET CLR via C#(第4版)第4章 类型基础
本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系 本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一 ...
- 重温CLR(三)类型基础
所有类型都从System.Object派生 “运行时”要求每个类型最终都要从System.Object类型派生.也就是说,一下两个类型的定义完全一致. //隐式派生自Object class Empl ...
- NET基础(1):类型基础
所有类型都从System.Object 派生,‘运行时’要求每个类型都从System.Object类派生,也就是说,以下两个类型定义完全一致: //隐式派生字Object class Employee ...
- 【C#进阶系列】04 类型基础
关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后 ...
- CLR Via C#: 类型基础
所有类型都从System.Object派生 一下两个类型定义是完全一致的 class Employee { } class Employee : System.Object { } 由于所有类型最终都 ...
- 《C#从现象到本质》读书笔记(二)第2章 C#类型基础(上)
<C#从现象到本质>读书笔记第二篇 第2章 C#类型基础(上) 类型指的是集合{类,结构,接口,枚举,委托}中的任意一个成员.任何拥有某类型的值(value)称为某类型的一个实例(inst ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
随机推荐
- AWR报告导出的过程报ORA-06550异常
刚才在笔记本上(win 7)想要导出一套RAC的AWR报告(linux),执行awrgrpt.sql的脚本的过程中报错了,报错的异常代码是:ORA-06550.经过检查,发现是用户的问题,换成sys用 ...
- org.springframework.orm.jpa.JpaTransactionManager
[第九章] Spring的事务 之 9.2 事务管理器 ——跟我学spring3 http://sishuok@com/forum/blogPost/list/0/2503.html
- UIScrollView解决touchesBegan等方法不能触发的解方案
新建一个类继承自UIScrollView 并重写下面的方法 -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [su ...
- UrlConnection doPost Https请求 、编码设置
UrlConnection doPost Https请求 .编码设置 UrlConnection doPost方法 /** * 发送POST请求 * * @param url 请求地址url * @p ...
- 简单方法打包.net程序集脱离framework
最近业余捣鼓monogame,自然而然就关注到了.net程序脱离framework发布的问题上了, 度娘,谷歌娘 都经过一番查找,无非分为如下几类方法: 1.直接使用mono运行时,附带 bin.li ...
- python编码基础知识
http://www.javaeye.com/topic/560229 一 预备知识 字符集1, 常用字符集分类ASCII及其扩展字符集作用:表语英语及西欧语言.位数:ASCII是用7位表示的,能表示 ...
- 【无聊放个模板系列】HDU 1358 KMP
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- UINavigationController使用的注意事项
1.常用属性viewControllers //所有在栈中的控制器topViewController //栈顶控制器navigationBar //导航栏 竖屏下默认44,横屏默认32 2.对navi ...
- *[topcoder]LittleElephantAndBalls
http://community.topcoder.com/stat?c=problem_statement&pm=12758&rd=15704 topcoder的题经常需要找规律,而 ...
- 8. Unity异常警告错误处理方法
一. The AnimationClip 'cube1_anim' used by the Animation component 'Cube1' must be marked as Legacy. ...