Unity基础之C#基础篇笔记3:值类型和引用类型
- 使用和储存上的区别
- 1.变量类型的复习
- 2.值类型和引用类型区别
- 3.习题
- 特殊的引用类型string
- 1.复习值和引用类型
- 2.string的它变我不变
- 3.通过断点调试在监视窗口中查看内存信息
- 4.练习
使用和储存上的区别
1.变量类型的复习
1.变量类型
1.无符号整形
byte b = 1;
ushort us = 1;
uint ui =1;
ulong u = 1;
2.有符身整形
sbyte s = 1;
short s = 1;
int i= 1;
long l = 1;
3.浮点数
float f =1f;
double d = 1.1;
decimal de = 1.1m;
4.特殊类型
bool bg = true;
char c = 'A';
string str = "strs";
5.复杂数据类型
enum枚举
数组(一维,二维,交错)
2.分为值类型和引用类型
引用类型:string,数组,类(未学习)
值类型:其它、结构体(未学习)
2.值类型和引用类型区别
1.使用上的区别
//值类型
int a = 10;//引用类型
int[] arr = new int[] { 1, 2, 3, 4 };
//申明了一个b让其等于之前的a
int b = a;
//申明了一个arr2让其等于之前的arr
int[] arr2 = arr;
Console.WriteLine("a={0}, b={1}", a, b);
Console.WriteLine("arr[0]={0},arr2[0]={1}", arr[0], arr2[0]);
b = 20;
arr2[0] = 5;
Console.WriteLine("修改了b和arr2[0]之后");
Console.WriteLine( "a ={0},b ={1}", a, b);
Console.WriteLine("arr[0]={0},arr2[0]={1}", arr[0], arr2[0]);
//打印结果 :
// a = 10, b = 10
// arr[0] = 1,arr2[0] = 1
// 修改了b和arr2[0]之后
// a = 10, b = 20
// arr[0] = 5,arr2[0] = 5
//值类型在相互赋值时 把内容拷贝给了对方 它变我不变
//引用类型的相互赋值 是让两者指向同一个值 它变我也变
区别:
值类型在相互赋值时 把内容拷贝给了对方 它变我不变
引用类型的相互赋值 是让两者指向同一个值 它变我也变
2.为什么有以上区别
值类型和引用类型 存储在的内存区域 是不同的, 存储方式 是不同的
所以就造成了他们在使用上的区别
值类型存储在:栈空间——>系统分配,自动回收,小而快
引用类型存储在:堆空间——>手动申请和释放,大而慢
值类型赋值关系图
引用类型赋值关系图
arr2 = new int[] { 99, 3, 2, 1 };
Console.WriteLine("arr[0]={0},arr2[0]={1}", arr[0], arr2[0]);
//打印结果 :
// arr[0] = 5,arr2[0] = 99
new int[] { 99, 3, 2, 1 };表示新开辟了一个数组空间arr2指向新开辟的空间,存储地址为新地址,与arr数组无关
3.习题
1.习题一
int a = 10;
int b = a;
b = 20;
Console.WriteLine(a);
请问打印结果为多少?
答案:10
值类型是存在栈上
值类型:它变我不变
2.习题二
int[] a = new int[]{10};
int[] b = a;
b[0] = 20;
Console.WriteLine(a[0]);
请问打印结果为多少?
答案:20
引用类型存在堆上
引用类型:它变我也变
3.习题三
string str = "123";
string str2 = str;
str2= "321"·
Console.WriteLine(str);
请问打印结果为多少?
答案:123
string是一个特殊的引用类型,它不遵循它变我也变
特殊的引用类型string
1.复习值和引用类型
值类型—它变我不变—存储在栈内存中
无符号整形,有符号整形,浮点数,char, bool ,结构体(未学习)
引用类型—它变我也变—存储在堆内存中
数组(—维、二维、交错),string,类(未学习)
2.string的它变我不变
string str1 = "123";
string str2 = str1;
//因为string是引用类型按理说 应该是它变我也变
//string非常的特殊 它具备 值类型的特征 它变我不变
str2 = "321";
Console.WriteLine(str1);//123
Console.WriteLine(str2);//321
//string虽然方便但是有一个小缺点 就是频繁的改变string重新赋值
//会产生内存垃圾
//优化替代方案 我们会在c#核心 当中进行讲解
3.通过断点调试在监视窗口中查看内存信息
string str1 = "123";
string str2 = str1;
//因为string是引用类型按理说 应该是它变我也变
//string非常的特殊 它具备 值类型的特征 它变我不变
str2 = "321";
Console.WriteLine(str1);//123
Console.WriteLine(str2);//321
1.断点
2.打开监视窗口
点击左下角监视窗口或者如图所示
3.输入监视内容
3.F10执行下一步
str1 地址产生,指向堆内存地址
4.F10再执行下一步
str2 地址产生,指向堆内存地址(内存地址与str1一致),表示指向同一内存空间
5.F10再执行下一步
运行完str2 = “321”;后,str2内存地址变了,表示重新在堆中开辟了一个内存空间,str2指向新内存地址
4.练习
int[] a = new int[]{10};
int[] b = a;
b = new int[5];
Console.WriteLine(a[0]);
请问打印结果为多少?
答案:10
new 在堆新开辟一个内存空间,和原来的无关
可以断点调试,在监视窗口查看一遍,巩固上诉内容