什么是变量?
变量本身被用来存储特定类型的数据,可以根据需要随时改变变量中所存储的数据值。
变量的组成
- 变量名:变量在程序源代码中的标识。
- 变量类型:确定它所代表的内存大小和类型。
- 变量值:它所代表的内存块中的数据。
值类型 - 值类型变量都存储在堆栈中
- 访问值类型变量时,一般都是直接访问其实例
- 每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响其他变量
- 复制值类型变量时,复制的是变量的值,而不是变量的地址
- 值类型变量不能为null,必须具有一个确定的值
举例:结构体(值类型)
引用类型
- 必须在托管堆中为引用类型变量分配内存
- 必须使用new关键字来创建引用类型变量
- 在托管堆中分配的每个对象都有与之相关联的附加成员,这些成员必须被初始化
- 引用类型变量是由垃圾回收机制来管理的
- 多个引用类型变量可以引用同一对象,在这种情形下,对一个变量的操作会影响另一个变量所引用的同一对象
- 引用类型被赋值前的值都是null
举例:类(引用类型)
值类型与引用类型的区别
- 从概念上看
值类型:直接存储其值,值在栈上
引用类型:存储对其值的引用,栈上存的是地址,值在堆上 - 从内存空间上看
值类型:在栈上分配内存,在内存中占用一个预定义的字节数
引用类型:在栈中分配一个内存空间,在堆中分配存储单元 - 简单理解:值类型相当于现金,要用就直接使用;引用类型相当于存折,要用得先去银行取
static void Main(string[] args)
{
//值类型
int v1 = 0; //声明一个int类型的变量v1,并初始化为0
int v2 = v1;//声明一个int类型的变量v2,并将v1赋值给v2
v2 = 100;//重新将变量v2赋值
//引用类型
A b1=new A();//使用new关键字创建引用对象
A b2 = b1;//使b1等于b2
b2.Value = 222;//设置变量b2的Value值
Console.WriteLine("Values:{0},{1}",v1,v2);
Console.WriteLine("Refs:{0},{1}",b1.Value,b2.Value);
Console.ReadLine();
}
}
class A //创建一个类A
{
public int Value = 0; //声明一个公共int类型的变量Value
}
栈和堆
- 栈
在编译的时候就分配好内存空间,在代码中有栈的明确定义。 - 堆
程序运行中动态分配的内存空间,可以根据程序的运行情况动态地分配内存的大小。
装箱和拆箱
- 装箱
将值类型隐式装换为引用类型的过程 - 拆箱
将引用类型显式转换为值类型的过程