System.Object 是 .NET 中所有类型的根吗?

Written by Allen Lee

这不是废话吗?每个人一接触 .NET 就会被提醒任何类型都是直接或者间接继承自 System.Object 的,即使 MSDN 也记录着类似的话。事实果真如此吗?如果你在命令行界面输入 ilasm /?,将会发现这样一个参数:

/NOAUTOINHERIT Disable inheriting from System.Object by default

现在,我尝试利用这个参数做一个没有基类的托管类型。首先,打开记事本,写下如下代码:

// Adam.cs

public class Adam
{
  public void Hello()
  {
    System.Console.WriteLine("I have no parents!");
  }
}

用 csc /t:library Adam.cs 把 Adam.cs 编译成 Adam.dll。接着,在记事本里写下如下代码:

// Program.cs

class Program
{
  static void Main()
  {
    Adam adam = new Adam();
    adam.Hello();
  }
}

并用 csc /r:Adam.dl Program.cs 把 Program.cs 编译成 Program.exe。运行一下这个程序,得到如下输出:

I have no parents!

当然,此时的 Adam 还不是真正没有 parent 的。现在,用 ILDASM 打开 Adam.dll,依次选择 File -> Dump 菜单,点击 OK,把 IL 代码另存为 Adam.il。接着,用记事本打开 Adam.il,找到 Adam 的定义,把它后面的 extends [mscorlib]System.Object 注释掉,保存、退出。然后,在命令行里输入 ilasm /dll /noautoinherit adam.il,得到新的 Adam.dll。现在,再次运行 Program.exe,虽然输出和之前一样,但当你使用 ILDASM 查看 Adam.dll 里的 Adam 类时,你发现它已经变成“真正的亚当”了!就连 Reflector 也说它没有 Base Types 了,呵呵~~~

然而,我不禁自问,这样一个类究竟有什么用呢?如果没有用处,那么 Microsoft 又为何在 2.0 中引入 /noautoinherit 这样一个参数呢?

转载于:https://www.cnblogs.com/allenlooplee/archive/2007/01/22/627386.html

System.Object 是 .NET 中所有类型的根吗?相关推荐

  1. 浅谈.NET中的类型和装箱、拆箱原理

    谈到装箱拆箱,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么建议你花点时间看看楼主这篇文章 1. .NET中的类型 为了 ...

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

    4.1 所有类型都从System.Object派生 "运行时"要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个 ...

  3. System.Object 基类

    System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都 ...

  4. 类型与通用语言运行时:System.Object

    CLR 要求每个类型最终都要继承自 System.Object 类型 1 //隐式继承 Object 2 class Employee { 3 ... 4 } 5 6 //显示继承继承 Object ...

  5. JAVA学习3-抽象类、内部类、数组、Object、System、String、基本包装类型

    21.类之间的关系 is a:继承关系 has a : 关联关系,通常以属性的形式存在 like a:实现关系,通常是类与接口的关系; 22.抽象类与接口的区别 抽象类是半抽象的,接口是完全抽象的: ...

  6. 预定义的类型“System.Object”未定义或未导入

    打开一个以前的程序 ,发现报这个错误.检查了程序,发现程序的引用 System 不见了 ,尝试 引用失败.. 查了有人说重新建立 Sln文件有用.. 一头雾水,随后 尝试操作 ,程序有用了 具体步骤: ...

  7. C#中所有对象共同的基类是System.Object

    C#中所有对象共同的基类是System.Object 转载于:https://www.cnblogs.com/boke1/p/11057080.html

  8. 错误 CS1069 未能在命名空间“System.IO.Ports”中找到类型名

    错误 CS1069 未能在命名空间"System.IO.Ports"中找到类型名 这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于 ...

  9. Object Pascal中String类型的内幕探讨 (转)

    Object Pascal中String类型的内幕探讨 (转) 在object Pascal中,String(准确的说是AnsiString)是一种可变长度的字符串,通过PChar(AString)可 ...

最新文章

  1. 计算机应用工作技能与经验,关于计算机应用技能人才培养模式的思考
  2. java 事件分发线程_Java事件调度线程说明
  3. CRM系统开发经验谈
  4. 25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛
  5. gdb查看空指针 linux_5 个鲜为人知 GNU 调试器(GDB)技巧
  6. 【费用流】【线性规划】志愿者招募(luogu 3980)
  7. 浅谈 OpenResty
  8. 百面机器学习—11.集成学习(GBDT、XGBoost)面试问题总结
  9. VS2010 打包生成exe文件后 执行安装文件出现 TODO:lt;文件说明gt;已停止工作并已关闭...
  10. 哄人必备-女友道歉信生成工具吾爱版
  11. 华为模拟器eNSP防火墙配置vlan实验
  12. 日常使用的图片文件格式及各自的区别,JPG/PNG/GIF/RAW/WebP/HEIC
  13. Android原生音量控制
  14. [CTF]-NepCTF2022
  15. 新浪短网址生成java_2020最新的新浪短网址(T.CN短链接)API接口分享
  16. Pycharm ssh远程调试报错: cannot connect to X server的解决方法
  17. gtx660 linux驱动下载,佳能 NVIDIA GeForce GTX660 GPU 驱动程序下载-更新佳能软件(显卡)...
  18. OPENWRT 修改串口(ttyS*)笔记
  19. Excel 导入Access 不能找到表达式中引用的字段的解决方案
  20. 目标检测/图像分割 评价标准IOU/准确率及精确率

热门文章

  1. 网易Q2季报图解:游戏营收重回百亿 净利同比降29%
  2. Ubuntu下一个好用的终端
  3. 修正memcache.php中的错误示例
  4. JdbcPagingItemReader多线程的Step
  5. C++学习之路: 单例模板
  6. 在golang编程中总结的基础语法及常见的问题
  7. android 安全讲座第三层 linux权限基础知识
  8. 让XP恢复文件权限功能
  9. ways to talk with girls
  10. 普林斯顿大学计算机科学与技术专业硕士项目拒信