值类型与引用类型
值类型与引用类型
- 值类型变量存储的是数据本身,引用类型变量存储的是数据的地址。
- 值类型数据事先就能预知需要分配的内存空间,而引用类型数据事先通常不能预知需要分配的内存空间。
- 值类型有:
int
,double
,bool
,char
,struct类型
等。 - 引用类型有:
string
,数组
,class类型
。 - 只有引用类型变量可以赋值为
null
,表示没有数据。
内存分配
- 声明变量时计算机就会分配内存,变量名就代表了这块内存的地址。
- 引用类型数据可以用
new
关键字申请内存。"likang"; // 分配了6 *2个字节的内存(其实还有一个结束符),一个char占2个字节。 new int[10]; // 分配了4*10个字节的内存。 new Hero(); // 分配的内存要看Hero类中数据。
- 分配内存时要明确分配的大小。
- 引用类型变量用4个字节(32位机的地址长度就是32位)存储一个内存地址。
double a; // 分配8个字节,因为每个double固定占8个字节。 int[] b; // 数组是引用类型,分配4个字节存储地址。
- 给引用类型变量赋值是把数据的首地址赋值给变量。
int[] a = new int[10]; // 执行过程: // 1.申明a变量,分配4个字节的内存。 // 2.new int[10],分配连续的40个字节内存。 // 3.把这40个字节内存的首地址赋值给a。
访问变量的过程
- 值类型是直接访问数据的。
- 引用类型要通过引用的地址访问数据。
ref
- 交换两个变量中的数据。
解释
struct
中不能定义本类型的变量,但class
中可以定义本类型的变量。
案例分析
- 传值与传引用
- 修改引用参数中的数据
- 修改引用参数
结构与类的区别
最早的类就是从结构演变过来的,
C++
中struct
和class
是完全一样的。但在C#
中他们有了不同的分工。
struct
表示一个包含多个数据的复合数据类型,class
用来封装一类事物的属性、方法、事件等。struct
是值类型,class
是引用类型。struct
中的变量不能赋初值,class
的可以。struct
中不能有本类型的成员变量,class
中可以有。struct
的构造函数要给所有成员变量赋值,class
不必。- 但定义了一个有参构造函数后
struct
中还会有默认无参构造函数,class
中就不会了。 struct
中必需有一个可访问的无参构造函数,class
中可以没有。