浅谈C#中所谓的 “值类型”
日期:2008年7月5日 作者: 查看:[大字体 中字体 小字体]-
在C#中,相信大家对于 "值类型" 并不陌生,因为它在我们代码设计中是不可缺少的,那么究竟什么是 "值类型" 呢? "值类型" 就是 我们用到的 Int16,Int32这些数值类型吗?
我们知道在C#中所有的类型继承于System.Object根类型,这也就意味着就代码层面来讲,在C#中所有的类型都是Class,,即一切都是Class类型,既然全部都是Class类型,那么值类型在哪里呢?我们可以发现在C#中System.Int16,System.Int32,System.Boolean...等等这些常用的类型都是Struct 结构类型,那么结构类型是什么,下面我们定义一个结构,然后通过IL Disassemble 工具来查看编译的中间代码便可以得到结果.public struct CustomerStruct
{
public string Name{get;set;}
}
代码非常简单,我们就定义一个struct类型,并且包含一个Name属性.

看到上面这幅图,相信大家都已经看到定义一个struct类型实际上编译把你所定义的类型继承了System.ValueType类型,换句话说,在C#中我们经常使用的System.Int16,System.Int32,System.Boolean..这些数值结构类型都是继承于System.ValueType类型,而System.ValueType又是继承于System.Object根类型,即验证我开始所讲到的在C#中一切类型都是Class。
之所以存在"值类型" 这个概念,其实是因为C#中的某些类型有这特殊的地位(即继承于System.ValueType的类型),CLR会特殊的对待这些类型,
看下面这2行代码
Int32 a = new System.Int32(10) ;CustomerStruct customer = new CustomerStruct() ;
首先为什么对于数值类型也可以使用 new 来进行内存分配呢? 上面已经讲到,因为他们都是Class类型,当然可以使用new 来进行内存分配.
其次,CLR执行这样的代码的时,CLR 通过反射(有待考察)或者其他途径来获知所要请求分配内存的类型是否继承于System.ValueType如果是的话,那么就在栈上进行分配,如果不是的话,那么就是我们所说的引用类型,就在托管堆上分配内存以及栈上分配对应的引用变量,这些一切都是CLR做的工作.
我们再来看看装箱操作.
object o = new object();Int32 aaa = 100;
o = aaa; //这里会发生装箱操作
我们都知道当CLR执行到 o = aaa;这条语句时会发生装箱操作,为什么会发生装箱操作呢?这是因为CLR 知道引用变量o所要引用的类型aaa是继承于System.ValueType类型的,继承于System.ValueType的类型都是在栈上分配的,而其它则是在托管堆上分配的,所以会CLR会弄得aaa的副本弄到托管堆上去,这一切也都是CLR的工作.
由此我们可以得出结论:
1.在C#中 就代码层面上讲 所有的类型都是Class类型.
2.所谓的 "值类型" != 数值类型,而是所有继承于System.ValueType 的类型. - [1] [2] 下一页
-
- 浅谈C#中所谓的 “值类型” 相关文章:
- ·从头到尾教你组建小型局域网
- ·五笔二级简码--五笔字型
- ·CPU型号大全总结
- ·五笔字型字根类型
- ·Div+CSS+JS树型菜单,可刷新
- ·大型企业局域网安全解决方案(1)
- ·[图文]一级简码--五笔字型
- ·Flash制作环型立体旋转的动态文字
- ·小型公司办公局域网搭建实例
- ·[图文]五笔字型键盘
- 浅谈C#中所谓的 “值类型” 相关软件
- ·《最终幻想7DC》大型原创RPG
- ·异型战机
- ·《Camgoo》大型摄像头游戏
- ·模型飞机大战
- ·《异型大战铁血战士2》免CD补丁
- ·型世言
- ·常用轴承型号对照软件 V1.08
- ·重型武器(Atomic Tank) V1.0
- ·Redfield全系列 PhotoShop 兼容型滤镜
- ·十四位数仿真科学计算器 V2.1 语音型
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
特别推荐
- ·C语言常用的三种排序方法总结与探讨
- ·C/C++笔试、面试题目大汇总
- ·C#基础概念二十五问
- ·利用C#远程存取Access数据库
- ·入门教程:实例详解C++友元
- ·C语言基础教程(三)输入输出函数及控制流程语句
- ·VC下调用ACM音频编程接口压缩Wave音频
- ·如何在C/C++中调用Java
- ·设计的一个计算器类的源代码,很简陋哦,请各位高手不要见笑!
- ·gSOAP中内存的使用
- ·Windows下C语言网络编程快速入门
- ·C语言教程第六章:指针
- ·漫谈C++ Builder多线程编程技术
- ·学生成绩管理系统实习
- ·用C#实现pdf文件的完整性验证
- ·将程序从托管扩展 C++ 迁移到 C++/CLI(1)
- ·链表的c语言实现(六)
- ·C语言库函数 (D类字母)
- ·用AVIFile函数制做AVI文件基本步骤
- ·利用C++实现的贪吃蛇游戏
