System.Object 是 .NET 中所有类型的根吗?
2007-01-22 23:50
351 查看
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 这样一个参数呢?
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 这样一个参数呢?
相关文章推荐
- System.Object 是 .NET 中所有类型的根吗?
- 4.1 所有类型都从 System.Object 派生
- 无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。
- System.Object类型剖析
- 类型与通用语言运行时:System.Object
- .net发生类型为 System.OutOfMemoryException 的异常解决办法
- 文件下载报错:引发类型为“System.OutOfMemoryException”的异常-.Net 内存溢出
- c# 所有类型都从Object类型派生
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义----问题解决办法
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型,原因为没有注册类
- 预定义的类型System.Object未定义或未导入
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“mshtml.HTMLInputElementClass
- PLSQL_Oracle Object所有数据库对象类型汇总和简解(概念)
- NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
- 所有类型的基类Object,所有类型的基类Type
- .NET中将Object类型数据转化为Json格式数据
- VBA遍历所有文件夹的两种方法(filesearch和FileSystemObject)
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义。必须添加对程序集 “System.Data.Entity, V
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“System.Data.SqlClient.SqlConnection的解决方法
- 通过反射得到object[]数组的类型并且的到此类型所有的字段及字段的值