4.1 所有类型都从 System.Object 派生
2017-06-16 23:21
176 查看
"运行时"要求各个类型最终都从 System.Object 派生。(显示继承/隐式继承)
提供公共方法(public):
Equals 判断两个对象相等,true 表示相等。
GetHashCode 返回对象的哈希值。
ToString 默认返回类型的完整名称(this.GetType().FullName)
GetType 返回 Type 派生的一个类型实例,指出对象的类型,返回的 Type 对象可以与反射类配合,获取与对象类型相关的元数据信息。GetType 为非虚方法,防止子类重写,隐瞒其类型,破坏安全性。
提供受保护方法(protected):
MemberwiseClone MemberwiseClone方法创建的新对象,然后将当前对象的非静态字段复制到新的对象创建的浅表副本。 如果字段是值类型,则执行字段的按位复制。 如果字段是引用类型,引用将复制。(MSDN)
Finalize 垃圾回收判断应被回收之后,对象内存被实际回收之前,会调用该虚方法。
new 操作符创建对象时所作的操作:
计算类型及其所有基类型(直到 System.Object,尽管它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。每个对象在堆上都需要一些额外成员—— type object pointer(类型对象指针)和 sync block index (同步块索引)——来管理对象。这些额外成员的字节要计入对象大小。
从托管堆中分配类型需要的字节数,从而为对象分配内存,所有的字节都设置为0。
初始化对象的 type object pointer 和 sync block index 成员。
调用实例的构造方法,并传递 new 调用中指定的实参。大多数编译器都在构造函数中自动生成代码来调用积累的构造函数。每个类型的构造函数第一反应则初始化该类型定义的实例字段。
没有 delete 操作符,没有办法显示的释放对象分配的内存。CLR 通过垃圾回收机制来自动释放内存。
Object 还提供两个静态方法:
Equal(Object, Object) 判断两个对象相等。
静态 Equals(Object, Object) 方法指示两个对象,objA 和 objB,是否相等。 它还使您能够值是相等的 null 的测试对象。 它将 objA 和objB 相等的如下:
它确定两个对象是否表示同一对象引用。 如果参数,则方法返回 true。 此测试具有名为 ReferenceEquals 方法等效。 此外,在中,如果 objA 和 objB 是 null,该方法返回 true。
它确定 objA 或 objB 是否 null。 如果是这样,则返回 false。
如果两个对象不表示同一对象引用,且均不为 null,它调用 objA。Equals(objB)和返回结果。 这意味着,如果 objA 重写 Equals(Object) 方法,该重写调用。
ReferenceEquals 确定指定的 Object 实例是否是相同的实例。
不像 Equals 方法和相等运算符,ReferenceEquals 方法不能被重写。 为此,如果要测试两个对象引用的平等,且不确定 Equals 方法的实现时,可以调用 ReferenceEquals 方法。 但是,请注意,如果 objA 和 objB 是值类型,则它们先装箱,然后传递给 ReferenceEquals 方法。
提供公共方法(public):
Equals 判断两个对象相等,true 表示相等。
GetHashCode 返回对象的哈希值。
ToString 默认返回类型的完整名称(this.GetType().FullName)
GetType 返回 Type 派生的一个类型实例,指出对象的类型,返回的 Type 对象可以与反射类配合,获取与对象类型相关的元数据信息。GetType 为非虚方法,防止子类重写,隐瞒其类型,破坏安全性。
提供受保护方法(protected):
MemberwiseClone MemberwiseClone方法创建的新对象,然后将当前对象的非静态字段复制到新的对象创建的浅表副本。 如果字段是值类型,则执行字段的按位复制。 如果字段是引用类型,引用将复制。(MSDN)
Finalize 垃圾回收判断应被回收之后,对象内存被实际回收之前,会调用该虚方法。
new 操作符创建对象时所作的操作:
计算类型及其所有基类型(直到 System.Object,尽管它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。每个对象在堆上都需要一些额外成员—— type object pointer(类型对象指针)和 sync block index (同步块索引)——来管理对象。这些额外成员的字节要计入对象大小。
从托管堆中分配类型需要的字节数,从而为对象分配内存,所有的字节都设置为0。
初始化对象的 type object pointer 和 sync block index 成员。
调用实例的构造方法,并传递 new 调用中指定的实参。大多数编译器都在构造函数中自动生成代码来调用积累的构造函数。每个类型的构造函数第一反应则初始化该类型定义的实例字段。
没有 delete 操作符,没有办法显示的释放对象分配的内存。CLR 通过垃圾回收机制来自动释放内存。
Object 还提供两个静态方法:
Equal(Object, Object) 判断两个对象相等。
静态 Equals(Object, Object) 方法指示两个对象,objA 和 objB,是否相等。 它还使您能够值是相等的 null 的测试对象。 它将 objA 和objB 相等的如下:
它确定两个对象是否表示同一对象引用。 如果参数,则方法返回 true。 此测试具有名为 ReferenceEquals 方法等效。 此外,在中,如果 objA 和 objB 是 null,该方法返回 true。
它确定 objA 或 objB 是否 null。 如果是这样,则返回 false。
如果两个对象不表示同一对象引用,且均不为 null,它调用 objA。Equals(objB)和返回结果。 这意味着,如果 objA 重写 Equals(Object) 方法,该重写调用。
ReferenceEquals 确定指定的 Object 实例是否是相同的实例。
不像 Equals 方法和相等运算符,ReferenceEquals 方法不能被重写。 为此,如果要测试两个对象引用的平等,且不确定 Equals 方法的实现时,可以调用 ReferenceEquals 方法。 但是,请注意,如果 objA 和 objB 是值类型,则它们先装箱,然后传递给 ReferenceEquals 方法。
相关文章推荐
- System.Object 是 .NET 中所有类型的根吗?
- 所有类型都从Object类型派生
- c# 所有类型都从Object类型派生
- System.Object 是 .NET 中所有类型的根吗?
- 解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化”错误的办法。
- dhl:类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义必须添加对程序集“System.Data.Entity"引用
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义。必须添加对程序集 “System.Data.Entity, V
- System.Object类型剖析
- 编译器错误消息: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义。
- 什么是System.__ComObject: 强类型RCW和弱类型RCW
- 10_9_4编写一个类MyCopyableClass,该类可以使用方法GetCopy()返回它本身的一个副本.这个方法应使派生与System.Object的MemberwiseClose()方法.该类
- 编译器错误消息: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义。
- 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义必须添加对程序集“System.Data.Entity"引用
- VBA FileSystemObject 用户定义类型未定义
- NHibernate 之 “ 值“System.Object[]”不是“”类型,不能在此泛型集合中使用。 参数名: value”
- 4.1 所有类型都从System.Object派生
- 获取System.__ComObject的真正类型
- 解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System
- 既然 int是值类型,而 class是引用类型,那么int是怎样从Object派生的呢?
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“System.Data.SqlClient.SqlConnection的解决方法