C#里面把数据类型分为两大类,分别为值类型和引用类型。
C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串string。
string运算看起来像值类型其实是运算符重载的结果。
关于值类型和引用类型的内存部署:
规律是:
- 引用类型部署在托管堆上;
- 值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。
简单地说“值类型存储在栈上,引用类型存储在托管堆上”是不对的。必须具体情况具体分析。
1. int a[10]
数组根据定义为引用类型在堆上
但数组元素虽为 int 类型但是却不在栈上而是在堆上
2. 类型嵌套
具体问题具体分析
适用场合:
(1) 值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
(2) 引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;
(3) 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型,如 int? a = null; );
(4) 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
参考:http://blog.csdn.net/qiaoquan3/article/details/51202926
下面说法错误的是:
(1) struct声明的类型是值类型 (√)
(2) 值类型是在堆上分配的 (x)
(3) 值类型不会被垃圾回收 (√)
(4) 值类型不需要指针来引用 (√)
(5) 引用类型在堆上分配,值类型在栈上分配 (√)
粗略地说:(5)可以认为正确。
9919

被折叠的 条评论
为什么被折叠?



