C#学习笔记——(五)
一、数据类型
1、数据类型
1>类型分类
- 通用类型系统CTS(Common Type System)是 .NET 框架中的一个组成部分,为所有面向 .NET 框架的语言定义了数据类型的规则;
- 值类型:存储数据本身
- 引用类型:存储数据的引用(内存地址)
2>类型归属
2、内存分配
1>内存
- 是CPU与其他外部存储器交换数据的桥梁;
- 用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理;
- 通常开发人员表达的"内存"都是指内存条。
2>分配
- 程序运行时,CLR将申请的内存空间从逻辑上进行划分;
- 栈区:
–空间小(1MB),读取速度快
–用于存储正在执行的方法,分配的空间兼做栈帧。栈帧中存储方法的参数以及变量等数据。方法执行完毕后,对应的栈帧将被清除。 - 堆区:
–空间大,读取速度慢
–用于存储引用类型的数据。
3、局部变量
- 定义在方法内部的变量
- 特点:
–没有默认值,必须自行设定初始值,否则不能使用
–方法被调用时,存在栈中,方法调用结束时从栈中清除
1>值类型与引用类型
-
值类型:
声明在栈中,数据存储在栈中 -
引用类型:
声明在栈中,数据存储在堆中,栈中存储该数据的引用 -
理解:
1、因为方法执行在栈中,所以在方法中声明的变量都在栈中
2、因为值类型直接存储数据,所以数据存储在栈中
3、又因为引用类型存储数据的引用,所以数据在堆中,栈中存储数据的内存地址
2>垃圾回收器
- GC(Garbage Collection)是CLR中一种针对托管堆自动回收释放内存的服务;
- GC线程从栈中的引用开始跟踪,从而判定哪些内存是正在使用的,若GC无法跟踪到某一块堆内存,那么认为这块内存不再使用,即为可回收的。
4、成员变量
- 定义在类中方法外的变量
- 特点:
–具有默认值
–所在类被实例化后,存在堆中,对象被回收时,成员变量从堆中清除
–可以与局部变量重名
1>值类型与引用类型
- 值类型:
声明在堆中,数据存储在堆中 - 引用类型:
声明在堆中,数据存储在堆的另一块空间
5、应用
1>比较
static void Main()
{
int num01 = 1, num02 = 1;
bool r1 = num01 == num02;//true,因为值类型存储的是数据,所以比较的时数据
int[] arr01 = new int[] {
1 }, arr02 = new int[] {
1 };
bool r2 = arr01 == arr02;//false,因为引用类型存储的时数据的引用,所以比较的是存储的引用
bool r3 = arr01[0]== arr02[0];//ture
}
2>赋值
static void Main()
{
// 值类型 引用类型
//int bool char string Array
//a在栈中 1在栈中
int a = 1;
int b = a;
a = 2;
Console.WriteLine(b);//?
//arr在栈中存储数组对象的引用(内存地址) 1在堆中
int[] arr = new int[] {
1 };
int[] arr2 = arr;
//arr2[0] = 2;//修改的是堆中的数据
arr = new int[]{
2};//修改的是栈中存储的引用
Console.WriteLine(arr2[0]);//?
string s1 = "男";
string s2 = s1;
s1 = "女";//修改的是栈中存储的引用
//s1[0]='女';//堆中的文字 不能修改
Console.WriteLine(s2);//?
// o1 在栈中 数据1 在堆中
object o1 = 1;
object o2 = o1;//o2得到的是数据1 的地址
o1 = 2;//修改的是栈中o1存储的引用
Console.WriteLine(o2);//?
}