C#四部曲基础——值类型和引用类型
·
一.使用和存储上的区别
1.变量类型复习
(1)无符号整型
byte、ushort、uint、ulong
(2)有符号类型
sbyte、short、int、long
(3)浮点型
float、double、decimal
(4)特殊类型
bool、char、string
(5)复杂数据类型
enum(枚举)、数组(一维、二维、交错)
2.分类
把以上的变量类型分为值类型和引用类型
(1)引用类型
string、数组、类(未学习)
(2)值类型
其他、结构体(未学习)
3.值类型和引用类型的区别
(1)使用上的区别
//值类型
int a = 10;
//引用类型
int[] arr1 = new int[] {1,2,3,4};
//申明一个b让其等于a
int b = a;
//申明一个arr2让其等于arr1
int[] arr2 = arr1;
Console.WriteLine("a={0},b={1}",a,b);
Console.WriteLine("arr1[0]={0},arr2[0]={1}",arr1[0],arr2[0]);
Console.WriteLine("修改b和arr2后")
b = 10;
arr2[0] = 5;
Console.WriteLine("a={0},b={1}",a,b);
Console.WriteLine("arr1[0]={0},arr2[0]={1}",arr1[0],arr2[0]);
值类型在相互赋值时,把内容拷贝给了对方,它变我不变
引用类型在相互赋值时,是让两者指向同一个值,它变我也变
(2)为什么有区别
值类型和引用类型存储在的内存区域是不同的,存储方式也是不同的
值类型存储在栈空间——系统分配的,自动回收,小而快
引用类型存储在堆空间——手动申请和释放,大而慢
引用类型在栈空间存储的是堆空间的地址
当赋值时,值类型赋值的值直接修改其所在栈空间的内容,不影响值类型的值,而引用类型赋值的值是修改其栈空间地址所指向在堆空间中的值,而引用类型地址不变,其他引用类型的地址指向的值发生了改变,所以其他引用类型也会跟着改变。
//引用类型
int[] arr1 = new int[] {1,2,3,4};
//申明一个arr2让其等于arr1
int[] arr2 = arr1;
Console.WriteLine("arr1[0]={0},arr2[0]={1}",arr1[0],arr2[0]);
Console.WriteLine("修改arr2后")
arr2[0] = 5;
Console.WriteLine("arr1[0]={0},arr2[0]={1}",arr1[0],arr2[0]);
Console.WriteLine("修改arr2为一个新数组后")
arr2 = new int[]{99,3,2,1};
Console.WriteLine("arr1[0]={0},arr2[0]={1}",arr1[0],arr2[0]);
这里相当于arr2开辟了一个新空间,申明了新的堆空间,地址发生了修改,所以输出的值不一样
二.特殊的引用类型string
1.复习值和引用类型
(1)值类型
它变我不变——存储在栈内存中
无符号整型、有符号整型、浮点型、char 、bool、结构体(未学习)
(2)引用类型
它变我也变——存储在堆内存中
数组(一维、二维、交错) string 类(未学习)
2.string的它变我不变
string str1 = "123";
string str2 = str1;
str2 = "321";
Console.WriteLine(str1);
Console.WriteLine(str2);
string 非常的特殊,具备值类型的特征 它变我不变
当给string重新赋值的时候,在堆内存中重新分配空间,地址也修改了
所以:虽然string方便,但是频繁的修改string的值,重新赋值,会产生内存垃圾
通过断点调试,可以在监视窗口查看内存信息
更多推荐
所有评论(0)