您的位置:首页 > 其它

关于CLR数据类型的一点思考

2014-03-21 21:15 323 查看
博文属于基础篇,大牛直接忽视,若有偏误,敬请斧正。

结论已然知晓,只求验证说服。

我们都是知道CLR(C#)支持两种数据类型:值类型和引用类型。
其实准确的说还有一种类型就是基元类型,这个类型可以这么理解:所有语言都支持的数据类型,或者说通用语言类型。
但是CLR却不直接支持基元类型,而是采用了类型映射的方式,即将int映射为Int32诸如此类的方式。
这些我们都很容易理解。

其次,我们知道在C#中一切类的都是直接或间接的继承自Object,或者说我们可以加将Object视为上帝,在C#中,不管是值类型和引用类型都是来之于Object的,Object执行有一个ValueType的类型这个就是我们所说的值类型,所有的值类型都被强制派生自ValeType。因此在MSDN的文档中我们经常会看到几种称呼:“类”、“结构“、枚举”。大致来说类、接口都是我么所说的引用类型,枚举、结构是我们所说的值类型。这里多说一句,GC在进行垃圾回收是不会回收值类型,这点需要注意。

好像没有什么不妥的样,但是当我翻看API时起初疑惑了,因为我发现了这么一个问题:



不是说,值类型直接派生值ValeType吗,为什么没有ValueType呢?
我疑惑呢。

不过我想微软自然会说说值类型都强制派生与于ValueType应该没问题,于是为了验证我写了这么一行代码:



编译通过,运行不报错,看来那句话是没有错滴啦。

但是我还是想明确的看到值类型继承了ValueType,于是乎我就定义了一个空的MyStruct结构体。



然后编译,去IL代码里看看,因为我相信不管你怎么隐藏你的实现,IL代码中必然会有蛛丝马迹,当我反编译生成的PE文件后,结果就明朗了,我也就是深刻理解微软那个强制继承的意义了,就好像所有的类型都强制继承Object一样的道理,编译器在最后的编译时才会给你加上那些上帝滴,LOOK!



所有,可以总结为:Object是所有类型(值类型和引用类型)的基类,所有值类型都强制继承ValueType。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: