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.为什么有以上区别

值类型和引用类型  存储在的内存区域  是不同的,   存储方式    是不同的
所以就造成了他们在使用上的区别
值类型存储在:栈空间——>系统分配,自动回收,小而快
引用类型存储在:堆空间——>手动申请和释放,大而慢

unity 类参数显示 unity变量类型_赋值

值类型赋值关系图

unity 类参数显示 unity变量类型_赋值_02

引用类型赋值关系图

unity 类参数显示 unity变量类型_赋值_03

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数组无关

unity 类参数显示 unity变量类型_赋值_04

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#核心  当中进行讲解

unity 类参数显示 unity变量类型_值类型_05

3.通过断点调试在监视窗口中查看内存信息

string str1 = "123";
            string str2 = str1;
            //因为string是引用类型按理说 应该是它变我也变
            //string非常的特殊  它具备  值类型的特征  它变我不变
            str2 = "321";
            Console.WriteLine(str1);//123
            Console.WriteLine(str2);//321

1.断点

unity 类参数显示 unity变量类型_引用类型_06


2.打开监视窗口

点击左下角监视窗口或者如图所示

unity 类参数显示 unity变量类型_值类型_07

3.输入监视内容

unity 类参数显示 unity变量类型_unity 类参数显示_08

3.F10执行下一步

unity 类参数显示 unity变量类型_unity 类参数显示_09

str1 地址产生,指向堆内存地址

4.F10再执行下一步

unity 类参数显示 unity变量类型_unity 类参数显示_10

str2 地址产生,指向堆内存地址(内存地址与str1一致),表示指向同一内存空间

5.F10再执行下一步

unity 类参数显示 unity变量类型_引用类型_11

运行完str2 = “321”;后,str2内存地址变了,表示重新在堆中开辟了一个内存空间,str2指向新内存地址

unity 类参数显示 unity变量类型_unity 类参数显示_12

4.练习

int[] a = new int[]{10};
int[] b = a;
b = new int[5];
Console.WriteLine(a[0]);
请问打印结果为多少?

答案:10
new 在堆新开辟一个内存空间,和原来的无关
可以断点调试,在监视窗口查看一遍,巩固上诉内容