不从 System.Object 继承之后
2007-01-23 23:26
429 查看
不从 System.Object 继承之后
Written by Allen Lee
上一篇文章说到 IL 允许创建一个不继承自 System.Object 的类,这打破了我们已有的一些认识。到了这个份上,我们自然会追问,为什么要允许这种类型存在呢?
考察如下 C++/CLI 代码:
1using namespace System;
2
3public ref class Person
4
28void DisplayPersonInfo(Person p)
29
33int main(array<System::String ^> ^args)
34Type t = typeof(NoInherit);
2Console.WriteLine(t.BaseType == null);
3
4NoInherit ni = new NoInherit("NoInherit");
5object o = ni as object;
6if (o != null)
7 Console.WriteLine(o.GetType());
9 Console.WriteLine(o.ToString());
10}
你猜上面代码的运行结果是什么?正常来说,运行结果应该只有一个 true,即第二行的输出,但事实上,第八行居然正确输出“NoInherit”,而第九行则抛出 AccessViolationException。按道理,第九行的异常是意料中事,但第二行和第五行的结果就很矛盾了。第二行输出 true 表明了 NoInherit 类的确没有继承自 System.Object,但第五行却转换成功,否则 o 应该是 null 的。
当一个系统复杂到一定程度,一个看似没问题的改动可能会导致一些看似不相关的问题。当你拿到一个库时,你是假定里面的所有类都继承自 System.Object,还是去验证一下呢?
Written by Allen Lee
上一篇文章说到 IL 允许创建一个不继承自 System.Object 的类,这打破了我们已有的一些认识。到了这个份上,我们自然会追问,为什么要允许这种类型存在呢?
考察如下 C++/CLI 代码:
1using namespace System;
2
3public ref class Person
4
28void DisplayPersonInfo(Person p)
29
33int main(array<System::String ^> ^args)
34Type t = typeof(NoInherit);
2Console.WriteLine(t.BaseType == null);
3
4NoInherit ni = new NoInherit("NoInherit");
5object o = ni as object;
6if (o != null)
7 Console.WriteLine(o.GetType());
9 Console.WriteLine(o.ToString());
10}
你猜上面代码的运行结果是什么?正常来说,运行结果应该只有一个 true,即第二行的输出,但事实上,第八行居然正确输出“NoInherit”,而第九行则抛出 AccessViolationException。按道理,第九行的异常是意料中事,但第二行和第五行的结果就很矛盾了。第二行输出 true 表明了 NoInherit 类的确没有继承自 System.Object,但第五行却转换成功,否则 o 应该是 null 的。
当一个系统复杂到一定程度,一个看似没问题的改动可能会导致一些看似不相关的问题。当你拿到一个库时,你是假定里面的所有类都继承自 System.Object,还是去验证一下呢?
相关文章推荐
- 不从 System.Object 继承之后
- 是否存在不继承自System.Object类型的类
- 接口继承自System.Object吗?
- Interface继承至System.Object?
- 接口类型是否继承于System.Object的讨论?
- Interface继承至System.Object? 推荐
- Interface继承至System.Object?
- ORA-31603: object "orders" of type TABLE not found in schema "SYSTEM"
- javascript ActiveXObject FileSystemObject 对象,创建、复制、删除、读取文件等
- 在存储过程中用ole对象(Scripting.FileSystemObject)读写文件
- FileSystemObject,ADODB.Stream 能否操作UTF-8格式的文件
- 类型“System.Web.WebPages.Razor.WebPageRazorHost”违反了继承安全性规则
- 黑马程序员---object-c知识点总结(一)封装,继承,多态
- 三种禁用FileSystemObject组件的方法
- 【Java基础】变长参数、Object[]类别、System.out.println异常
- 继承hibernateDaoSupport之后通过注解方式注入SessionFactory
- object-c之自定义UITableViewCell控件的继承和数据的封装
- FileSystemObject
- 1.每颗类继承树一张表:Object,hbm
- JavaScript Scripting.FileSystemObject FSO属性大全