深入C#数据类型
一.值类型和引用类型
1.概述
(1).值类型
源于System.ValueType家族,主要包括基本数据类型和枚举类型
int heightZhang = 170;//张浩的身高
int heightLi = heightZhang;//赋值操作
Console.WriteLine("去年--张浩的身高是:" + heightZhang + ",李明的身高是:" + heightLi);
heightLi = 180;//今年李明德身高变为180
Console.WriteLine("今年--张浩的身高是:" + heightZhang + ",李明的身高是:" + heightLi);
小结:对值类型,不同的变量会分配不同的存储空间,并且存储空间中存储的是该变量的值。赋值操作传递的是变量的值,改变一个
变量的值不会引用另一个变量的值。
(2).引用类型
源于System.Object家族,主要包括数组,类和接口
int[] infoZhang = new int[] { 170,60 };//张浩的身高和体重信息
int[] infoLi = infoZhang;//数组引用赋值
Console.WriteLine("去年--张浩的身高是:" + infoZhang[0] +"体重是:"+infoZhang[1]+ ",李明的身高是:" + infoLi[0]+"体重是:"+infoLi[1]);
infoLi[0] = 180;//今年李明的身高变为180
infoLi[1] = 70;//今年李明的体重变为70
Console.WriteLine("去年--张浩的身高是:" + infoZhang[0] + "体重是:" + infoZhang[1] + ",李明的身高是:" + infoLi[0] + "体重是:" + infoLi[1]);
小结:对引用类型,赋值是把对原对象的引用传递给另一个引用。对数组而言,当一个数组引用赋值给另一个数组引用后,这两个
引用指向同一个数组,也就是指向同一块存储空间。
int[] infoZhang = new int[] { 170,60 };
int [] infoLi=new int[2];
Console.WriteLine("复制前--李明的身高是:"+infoLi[0]+"体重是:"+infoLi[1]);
//数组赋值
for (int i = 0; i < infoZhang.Length;i++ )
{
infoLi[i] = infoZhang[i];
}
Console.WriteLine("去年--张浩的身高是:" + infoZhang[0] + "体重是:" + infoZhang[1] + ",李明的身高是:" + infoLi[0] + "体重是:" + infoLi[1]);
infoLi[0] = 180;//今年李明的身高变为180
infoLi[1] = 70;//今年李明的体重变为70
Console.WriteLine("今年--张浩的身高是:" + infoZhang[0] + "体重是:" + infoZhang[1] + ",李明的身高是:" + infoLi[0] + "体重是:" + infoLi[1]);
(3).细分值类型和引用类型
值类型:基本数据类型(整形:int;长整形:long;浮点型:float;双精度型:double;字符型:char;布尔型:bool),
枚举类型(枚举:enum),结构类型(结构:struct)
引用类型:类(基类:System.Object;字符串:string;自定义类:class),接口(interface),数组(int[];string[])
2.结构
(1).结构的定义
语法:
访问修饰符 struct 结构名
{
//结构体
}
(2).结构的使用
注意:可以不用new,直接定义结构的对象即可;
声明结构的对象后,必须给结构的成员赋初值
(3).结构的使用经验
当对象需要较少的字段来表示时,就可以选用结构来实现
3.装箱和拆箱
装箱:
int i = 123;
object o = i;//装箱
i = 456;//改变i的内容
Console.WriteLine("值类型的值为{0}",i);
Console.WriteLine("引用类型的值为{0}", o);
拆箱:
int i = 123;
object o = i;//装箱
int j = (int)o;//拆箱
Console.WriteLine("值类型的值为{0}", i+"\t"+j);
Console.WriteLine("引用类型的值为{0}", o);
将值类型转换为引用类型的过程称为装箱,反之称为拆箱
经验:在实际的开发中,应该尽量减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时性能损失较大。
二.不同类型的参数传递
1.概述
使用值传递,在方法中对参数值的更改在调用后不能保留;
使用ref方式传递,可以保留对参数值的更改。
2.值方式参数传递
(1).使用引用类型作为参数
(2).使用值类型作为参数
3.引用方式参数传递
(1).使用引用类型作为参数
(2).使用值类型作为参数
一.值类型和引用类型
1.概述
(1).值类型
源于System.ValueType家族,主要包括基本数据类型和枚举类型
int heightZhang = 170;//张浩的身高
int heightLi = heightZhang;//赋值操作
Console.WriteLine("去年--张浩的身高是:" + heightZhang + ",李明的身高是:" + heightLi);
heightLi = 180;//今年李明德身高变为180
Console.WriteLine("今年--张浩的身高是:" + heightZhang + ",李明的身高是:" + heightLi);
小结:对值类型,不同的变量会分配不同的存储空间,并且存储空间中存储的是该变量的值。赋值操作传递的是变量的值,改变一个
变量的值不会引用另一个变量的值。
(2).引用类型
源于System.Object家族,主要包括数组,类和接口
int[] infoZhang = new int[] { 170,60 };//张浩的身高和体重信息
int[] infoLi = infoZhang;//数组引用赋值
Console.WriteLine("去年--张浩的身高是:" + infoZhang[0] +"体重是:"+infoZhang[1]+ ",李明的身高是:" + infoLi[0]+"体重是:"+infoLi[1]);
infoLi[0] = 180;//今年李明的身高变为180
infoLi[1] = 70;//今年李明的体重变为70
Console.WriteLine("去年--张浩的身高是:" + infoZhang[0] + "体重是:" + infoZhang[1] + ",李明的身高是:" + infoLi[0] + "体重是:" + infoLi[1]);
小结:对引用类型,赋值是把对原对象的引用传递给另一个引用。对数组而言,当一个数组引用赋值给另一个数组引用后,这两个
引用指向同一个数组,也就是指向同一块存储空间。
int[] infoZhang = new int[] { 170,60 };
int [] infoLi=new int[2];
Console.WriteLine("复制前--李明的身高是:"+infoLi[0]+"体重是:"+infoLi[1]);
//数组赋值
for (int i = 0; i < infoZhang.Length;i++ )
{
infoLi[i] = infoZhang[i];
}
Console.WriteLine("去年--张浩的身高是:" + infoZhang[0] + "体重是:" + infoZhang[1] + ",李明的身高是:" + infoLi[0] + "体重是:" + infoLi[1]);
infoLi[0] = 180;//今年李明的身高变为180
infoLi[1] = 70;//今年李明的体重变为70
Console.WriteLine("今年--张浩的身高是:" + infoZhang[0] + "体重是:" + infoZhang[1] + ",李明的身高是:" + infoLi[0] + "体重是:" + infoLi[1]);
(3).细分值类型和引用类型
值类型:基本数据类型(整形:int;长整形:long;浮点型:float;双精度型:double;字符型:char;布尔型:bool),
枚举类型(枚举:enum),结构类型(结构:struct)
引用类型:类(基类:System.Object;字符串:string;自定义类:class),接口(interface),数组(int[];string[])
2.结构
(1).结构的定义
语法:
访问修饰符 struct 结构名
{
//结构体
}
(2).结构的使用
注意:可以不用new,直接定义结构的对象即可;
声明结构的对象后,必须给结构的成员赋初值
(3).结构的使用经验
当对象需要较少的字段来表示时,就可以选用结构来实现
3.装箱和拆箱
装箱:
int i = 123;
object o = i;//装箱
i = 456;//改变i的内容
Console.WriteLine("值类型的值为{0}",i);
Console.WriteLine("引用类型的值为{0}", o);
拆箱:
int i = 123;
object o = i;//装箱
int j = (int)o;//拆箱
Console.WriteLine("值类型的值为{0}", i+"\t"+j);
Console.WriteLine("引用类型的值为{0}", o);
将值类型转换为引用类型的过程称为装箱,反之称为拆箱
经验:在实际的开发中,应该尽量减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时性能损失较大。
二.不同类型的参数传递
1.概述
使用值传递,在方法中对参数值的更改在调用后不能保留;
使用ref方式传递,可以保留对参数值的更改。
2.值方式参数传递
(1).使用引用类型作为参数
(2).使用值类型作为参数
3.引用方式参数传递
(1).使用引用类型作为参数
(2).使用值类型作为参数