值类型和引用类型区别(转)
来源:互联网 发布:长城软件客服电话 编辑:程序博客网 时间:2024/05/21 04:09
我们都知道,c#的两大数据类型分别为值类型和引用类型。很多人或许闭着眼睛都能说出值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但是当被问及到二者之间的联系和区别,什么时候用struct什么时候用class时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。
- 值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
- 从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
- 值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。
- C# 的统一类型系统,使得值类型可以转化为对象来处理,这就是常说的装箱和拆箱。由于装拆箱需要装建全新对象或做强制类型转换,这些操作所需时间和运算要远远大于赋值操作,因此不提倡使用它,同时也要尽量避免隐式装拆箱的发生。
注:栈是操作系统分配的一个连续的内存区域,用于快速访问数据。因为值类型的容量是已知的,因此它可存储在栈上。而托管堆是CLR在应用程序启动时为应用程序预留的一块连续内存区,是用于动态内存分配的内存区,引用类型的容量只有到运行时才能确定,所有用堆来存储引用类型。
- 值类型和引用类型区别(转)
- 值类型和引用类型区别示例
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 6. 区别值类型和引用类型。
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别 .
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- 值类型和引用类型的区别
- c# 引用类型和值类型区别
- 值类型和引用类型的区别
- 值类型和引用类型区别
- ajax open方法 带用户验证
- 关于用JAVA对MY SQL的InnoDB进行CUD操作时的问题.
- 2010.06.03日志读取手机全部应用软件信息
- Windows Service开发框架
- 解决wordpress打不开——循环重定向问题
- 值类型和引用类型区别(转)
- Linux下安装netbeans
- TORNADO下编译出现undefined reference to `itoa'错误
- svn 错误 以及 中文翻译
- dll中DllMain的作用
- C++序列化的库
- DOS 命令:建立用户和用户组脚本
- 有没有帮忙的呀??
- 理时:2010-06-02----------2010-06-06