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

分析问题

  可能读者的固有思维认为.NET中所有的类型都必须继承自System.Object,这样的认识过于绝对,且不完全正确。在.NET中,.NET设计小组为中间语言的编译器ILasm.exe添加了noautoinherit开关,当这个开关被打开时,编译器将不会默认年地把类型认为继承自System.Object。

  首先介绍一下中间语言的编译工具:ILasm.exe。这是.NET Framework提供的一个编译工具,它的作用是把中间语言(MSIL)编译成可执行的PE文件。该工具非常有用,它不仅使程序员有机会能够直接编写中间语言并且编译成PE文件,而且提供了另外一种部署方式,即手动地编译所有的中间代码并且直接部署最终的机器代码。

  如果程序员用的开发语言是C#,则在编译成中间语言时,类型已经被默认地添加了继承自System.Object的代码,这时候无论是否为ILasm.exe打开noautoinherit开关,生成的类型都将继承自System.Object,但如果程序员手动地编写了不继承自System.Object类型的中间代码,并且使用noautoinherit开关,则会生成一个特别的无父类的类型。

  在全托管单语言的编程环境下,设计不继承自System.Object的类型不会带来任何好处,相反地,它会导致种种违反常规的运行错误。不继承自System.Object的类型不符合CLS的规范,并且在正常的程序中出现意外的异常。但是为了融合其他编程语言(比如C++/CLI),这样的内建机制有着其独特的作用。在通常情况下,读者不需要也不应该建立不继承自System.Object的类型,但需要注意的是,在特殊的环境下任何代码不能作出对象类型继承自System.Object的保证,甚至于不能相信as、is等类型检查语法的结果。程序员唯一可以并且必须做得就是:时刻准备着捕捉各种意料之外的异常。

答案

  通过运用ILasm.exe的noautoinherit开关,可以生成不从System.Object继承的类型,这种类型不是安全的类型,也不建议使用。但是,这样机制的存在,促使程序员在编写代码时不能随意地把任何对象默认地看成System.Object的子类类型。

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

时间: 2025-01-02 15:13:23

是否存在不继承自System.Object类型的类的相关文章

Entity FreamWork 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型错误解决

Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指定的类型,结果,发现执行EF在查询的时候,不能支持equal,只能用==,理由很简单,因为equal是object的方法,虽然所有的类都是object的子类,但是ef不支持复杂类型的直接检索,只能用简单类型,比如常用的string,int,guid,这些,都可以做==,也可以用来检索.但是比如Per

无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型

Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指定的类型,结果,发现执行EF在查询的时候,不能支持equal,只能用==,理由很简单,因为equal是object的方法,虽然所有的类都是object的子类,但是ef不支持复杂类型的直接检索,只能用简单类型,比如常用的string,int,guid,这些,都可以做==,也可以用来检索.但是比如Per

.NET基础 (11)类型的基类System.Object

类型的基类System.Object1 是否存在不继承自System.Object类型的类2 在System.Object中定义的三个比较方法有何异同3 如何重写GetHashCode方法 类型的基类System.Object1 是否存在不继承自System.Object类型的类 通过运行ILasm.exe的noautoinherit开关,可以生产不从System.Object继承的类型,这种类型是不安全的类型,也不建议使用. 2 在System.Object中定义的三个比较方法有何异同 静态方

类型与通用语言运行时: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:方法返回对象的值的散列码.如果一个对象被用作散列表的一个键值,那

System.Object 基类

System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都继承于System.Object.因此,所有的类型都具有下面这些特性: GetType()方法,获取对象的类型. Equals.ReferenceEquals和==,判断对象是否相等. ToString()方法,获取对象的字符串信息,默认返回对象带命名空间的全名.

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

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

System.Object

[System.Object] 1.所有类均继承自System.Object,无论自定义类有无显式继承于System.Object. 2.Object的GetType()实例方法用于获取一个类的类型对象System.Type.通过System.Type对象的Name方法,可以获取一个类的类名. GetType()方法用于返回对象真实类型,如果一个Base ref引用了一个Derived对象,则GetType().Name返回Derived. 3.Object的Equals方法有实例和类方法2种.

C#中system.object的函数方法功能介绍-转载

C#中system.object的函数方法功能介绍 在C#中,Object类型是所有类型的根,大家平常开发中都要跟它打交道,但不见得对它里面的每个方法都知根知底,下面对它里面的每个方法都进行仔细的总结. 概述: 构造函数 Equals函数 Finalize函数 GetHashCode函数 GetType()函数 ReferenceEquals函数 MemberWiseClone()函数 ToString()函数 Object类型中一共有8个方法,重载的方法没有算进来.下面一一来看看这些方法. 1

c# System.Object类和数据的安全转型

.NET Fraework 最重要的引用类型之一是System命名空间中Object类.所有的类都是System.Object的派生类.System.Object类型的变量System.Object的别名.可以写成Object.优先考虑Object Object类型的变量能够引用任何引用类型的任何对象.除此之外Object类型的变量也能引用值类型的实例. 在强制类型转换的过程中,如果内存中的对象类型与指定的类型不匹配,运行时会抛出InavalidCastException异常,在编写程序的时候,