深入C#数据类型
2021-07-17 06:21
深入C#数据类型
1.值类型和引用类型
1.值类型:直接把数据类型存储在栈中
问题:已知李明和张浩去年的身高都为170cm,而今年李明身高长到了180cm,张浩没有变化,输出去年和今年两人的身高
代码:
int heightzhang = 170;
int heightLi = heightzhang;
Console.WriteLine("张浩的身高为:{0} 李明的身高为:{1}",heightzhang,heightLi);
heightLi = 180;
Console.WriteLine("张浩的身高为:{0} 李明的身高为:{1}", heightzhang, heightLi);
Console.ReadLine();
小结:值类型:不同的变了会分配不同的存储空间,存储空间中存储的是该变了的值,改变一个变量值不会影响另一个变量值
2.引用类型:直接把数据类型存储在堆中
1.问题:已知李明和张浩去年的身高都为170cm体重都为60kg,而今年李明身高长到了180cm体重长到70kg,张浩没有变化,输出去年和今年两人的身高
代码:
int[] li = { 170,60};
int[] zhang = li;
Console.WriteLine("去年—张浩身高为:{0} 体重为:{1} 李明身高为:{2} 体重为:{3}",zhang[0],zhang[1],li[0],li[1]);
li[0] = 180;
li[1] = 70;
Console.WriteLine("去年—张浩身高为:{0} 体重为:{1} 李明身高为:{2} 体重为:{3}", zhang[0], zhang[1], li[0], li[1]);
Console.ReadLine();
为什么会出现张浩和李明的值都改变了呢?
首先,系统分配了一段空间创建数组,用来存储信息,标识符Li只是一个引用,它指向了内存中创建的这个数组,然后程程序引用Li赋值给zhang因为zhang并没有分配一段存储空间,
而是和Li使用了同一段存储空间,所以后面的程序在修改黎明的身高和体重时也同样修改了张浩的信息。
图片概括了变化过程:
小结:对引用类型,赋值是把元对象引用传递给另一个引用。对数组而言,当一个数组赋值给另一个引用后,这两个音乐只想同一个数组,也就是只想用 一块存储空间
1.结构
1.结构的定义
访问修饰符 struct 结构名
{
//结构体
}
结构的定义有以下特点:
结构中可以有字段
定义时,结构中的字段不能被赋值
2.结构的使用
可以不用new,直接定义结构的对象即可
声明结果的对象后,必须给结果的成员赋初始值
小结:结构是值类型,声明结构变量就存储一个结构的新副本,及系统要开辟一块新的存储空间,因此结构用得越多所消耗的存储空间也越多
2.装箱和拆箱
定义将值类型转换为引用类型的过程称为装箱,反之成为拆箱。
1.装箱
当改变i的值时,因为i是值类型,所以只能改变它自己的值,而无法修改引用类型object的类型。可以理解为创建一个object实例,并将i的值复制给object
2.拆箱
先将之类型i进行装箱,然后把转换后的引用类型o进行拆箱处理,切记拆箱时,被转换引用类型的数值必须能够转换为目标值类型。
经验:在实际开发中,应该尽量减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时性能损失较大。
总结
*基本数据类型,如整型、浮点型字符型、bool型及结构属于值类型;数组、接口和类属于引用类型
*结构是值类型数据,可以看成轻量级的类,使用的时候可以不用new
*值类型转换为引用类型称为装箱,反之称为拆箱
上一篇:前端js上传文件后端C#接收文件
下一篇:深入C#框架