一,值类型和引用类型
1.值类型源于System.ValueType 家族 ,每个值类型的对象都有一个独立的内存区域,用于保存自己的值,值类型数据所在的内存区域称为 “栈” (Stack)。
只要在代码中修改它,就会在他的内存区域内保存这个值。值类型主要包括基本数据类型(如 int,float,double)和枚举类型等。
C#中常用的数据类型
常用数据类型 Java C# 举例
整型 int int 年龄
浮点型 float float 成绩
双精度型 double double 圆周率
字符串 String string 家庭住址
布尔型 boolean bool 是否为少数民族
枚举类 enum enum 颜色
2.引用类型
引用类型源于System.Object家族,在C#中引用类型主要包括数组,类和接口等。
所有的值类型和引用类型的引用都存在栈上。
值类型赋值原理:在栈上复制的真实值A=B,将B变量中的存储的真实内容赋给了A
小Tip:堆上存储的真实对象本身真实对象属性。
二,结构。
结构的定义:
语法: 访问修饰符 struct 结构名
{
//结构体
}
结构体定义特点:
1.结构体中可以有字段,也可以有方法。
2.定义时,结构体中的字段不能赋初始值。
2.结构体的使用
结构体的构成和类有些相似在使用时注意以下几点:
1.可以不用new,直接定义结构对象即可。(条件:如果结构体中成员变量和成员方法。那么调度方法之前一定要给成员变量赋初值,否则不用new)
2.声明结构的对象后,必须给结构成员赋初始值。
构造概念:
在一个类中,一个方法名称和类名相同,而没有任何返回值类型,那么我们可以成这个方法为构造,一个类有0(反编译到底层,编译器会补全一个无参构造给我们)
到多个构造,而且构造函数可以是公用的,也可以是私有的。
3.结构的使用和经验
结构是值类型的,声明结构变量就存储一个结构的新副本,计系统要开辟一块新的空间,因此结构用得越多所消耗的空间也就越多。
三,拆箱和装箱。
数据类型存储方式可以分为值类型和引用类型,两者仍然可以相互转换。将值类型转换为引用类型的过程就做装箱,反之称为拆箱。
示例:
static void Main(string[] args) { int i=123; object o=i; //装箱 i=456; //改变i的内容 Console.WriteLine("值类型的值为{0}",i); Console.WriteLine("引用类型的值为{0}",o); }
当改变i的值时,因为只能改变它自己的值,而无法修改引用类型object 的类型,可以理解为创建一个object实例,并将i的值复制给这个object。
示例:
static void Main(string[] args) { int i=123; object o=i; //装箱 int j=(int)o; //拆箱 }
先将类型i进行装箱,然后把转换后的引用类型o 进行拆箱处理。切记拆箱时,被转换引用类型的数值必须能够转换为目标类型。
经验:在实际开发中,应该减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时损耗的性能比较大。
值方式参数传递:
在值方式传递时,参数可以是引用类型,也可以是值类型。
值传递:值类型(不会改变)引用类型(会改变)
引用传递:ref值类型(会改变)ref引用类型
示例1:使用引用类型作为参数
private void Vote(ref SE se) { //人气值增加1 se.Popularity++;
}
示例2:使用值类型作为参数
private void Vote(ref StructSE se) { //人气值加1 se.Popularity++; }
结论:无论引用方式传递,还是传递值类型程序运行的结果都一样:员工的人气值发生了变化。
小结:使用值方式(不用ref修饰)传递值类型参数时,参数在方法中的修改不会保留。
使用值方式(不用ref修饰)传递引用类型参数时,参数在方法中的修改会保留。
使用引用方式(用ref修饰)传递值类型或引用类型参数时,参数在方法的修改都会保留。