System.Object 是 .NET 中所有类型的根吗?
System.Object 是 .NET 中所有类型的根吗?
Written by Allen Lee
这不是废话吗?每个人一接触 .NET 就会被提醒任何类型都是直接或者间接继承自 System.Object 的,即使 MSDN 也记录着类似的话。事实果真如此吗?如果你在命令行界面输入 ilasm /?,将会发现这样一个参数:
/NOAUTOINHERIT Disable inheriting from System.Object by default
现在,我尝试利用这个参数做一个没有基类的托管类型。首先,打开记事本,写下如下代码:









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










并用 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 这样一个参数呢?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架