值类型:(整形)int、(长整形)long、(浮点型)float、(字符型)char、(布尔型)bool、(枚举)enum、(结构)struct
引用类型:(基类)Object、(字符串)string、(类)class、(接口)inferface、(数组)int[]
储存方式:
引用类型:数据储存在堆中,引用储存在栈中;
值类型:数据直接储存于栈中。视情况而定,比如类中声明了一个int类型的值类型,那么这个值类型就储存于堆中。
区别:
继承
值类型继承于System.ValueType类
引用类型继承于System.Object类
赋值
//值类型
int i = 0;
int j = i;
j = 1;
Console.Write(i + "\t" + j); //输出 0 1
//引用类型
int[] arry = new int[] {1};
int[] arry1 = arry;
arry1[0] = 0;
Console.Write(arry[0] + "\t" + arry1[0]); //输出 0 0
看下方是图,就明白了
值类型的数据再次创建的时候是直接在栈中再次开辟一个空间,就是两个空间,互不影响!所有当我们修改 j 的值的时候,是不会影响 i 的值!
引用类型数据是引用的,当我们修改了里面的数据的时候,其他引用者自然随之而改变!
堆与栈
储存方式如图所示,可以看到,值类型和引用是储存在栈中的,引用的值是储存在堆中的!
然后的话栈是先进后出的,就是说如果要清理的话会先清理最后面放进来的
堆在C#中其实是叫托管堆,他与堆是不同的,在.NET中它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了之后,会自动清理堆中的垃圾!