### .NET常用类的接口 #### 5.1 类型的基类 `System.Object` 在.NET框架中,`System.Object`作为所有类型的基类扮演着至关重要的角色。深入理解`System.Object`及其特性对于.NET开发者而言是十分必要的,因为这有助于开发者编写更加高效和简洁的代码。 ##### 5.1.1 是否存在不继承自 `System.Object` 类型的类 在.NET平台中,大多数情况下,所有的类型都会隐式地继承自`System.Object`。然而,在特定条件下,可以通过特定的手段创建不继承自`System.Object`的类型。这一特性是在.NET 2.0版本中引入的,它允许开发者通过使用中间语言(IL)编译器`ILasm.exe`与`NoAutoInherit`开关来实现这一目的。 **所涉及的知识点** - **ILasm.exe 的使用**:这是一个由.NET Framework提供的工具,用于将中间语言(MSIL)编译成可执行的PE文件。 - **NoAutoInherit 开关的使用**:此开关在使用`ILasm.exe`编译中间语言时可以指定,以避免类型默认继承自`System.Object`。 **分析问题** .NET平台的设计原则之一就是所有类型默认继承自`System.Object`。这一设计确保了类型之间的一致性和互操作性。然而,在某些特殊场景下,这种默认继承可能会带来不必要的开销或者限制,尤其是在进行底层编程或需要更高灵活性的情况下。 在.NET 2.0中,为了增加灵活性并满足特定需求,设计团队在`ILasm.exe`工具中加入了`NoAutoInherit`开关。通过启用这个开关,编译器在处理中间语言时将不会自动将类型视为继承自`System.Object`。需要注意的是,如果使用C#等高级语言编译成中间语言时,类型已经被默认添加了继承自`System.Object`的代码。这意味着即使启用了`NoAutoInherit`开关,生成的类型仍然会继承自`System.Object`。 然而,如果手动编写了不继承自`System.Object`的中间代码,并且在编译时启用了`NoAutoInherit`开关,则可以生成一个没有父类的特殊类型。下面的示例代码展示了这一过程: **代码5-1 NoAutoInherit-NotObject:NotObject.cs** ```csharp namespace NET.MST.Fifth.NotObject { public class NotObject { public NotObject() { Console.WriteLine("我没有父类"); } } } ``` **编译步骤** 1. 使用C#编译器编译原始类型代码: ``` csc.exe /t:library NotObject.cs ``` 2. 使用`ILDasm.exe`反编译生成的`NotObject.dll`: ``` ILDasm.exe NotObject.dll ``` 3. 在反编译后的中间语言代码中删除继承自`System.Object`的相关代码: ```il .class public auto ansi beforefieldinit NET.MST.Fifth.NotObject.NotObject // 注释这里的代码让NotObject无父类 // extends [mscorlib]System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed ``` 4. 使用`ILasm.exe`重新编译修改后的中间语言代码: ``` ILasm.exe NotObject.il /DLL ``` 通过以上步骤,我们可以创建一个不继承自`System.Object`的类型。虽然这种情况在实际开发中较为罕见,但它展示了.NET平台的灵活性以及底层编程的可能性。对于.NET开发者而言,了解这些底层细节是非常有益的,尤其是在处理高性能应用或需要进行高级优化的场景下。
- 普通网友2014-05-19讲解比较全面,内容探讨的很深入
- 大怪兽112013-05-23看了楼主的资料表是很有用啊 点赞
- 粉丝: 27
- 资源: 155
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助