C#值类型和引用类型
**前言:**在C#中变量分为以下几种类型:值类型(Value Types),引用类型(Reference Types),指针类型(Pointer Types);指针类型(变量存储另一种类型变量的地址)与C++中的使用方式一致,主要分析值类型和引用类型。
1.值类型:
(1)所有的值类型都隐式派生自System.Value.Type,包括整型(byte,int),浮点型(float,double,decimal),布尔型(bool),字符型(char),结构体(Struct),枚举类型(enum),可空类型。
(2)值类型的变量,直接存储数据,数据存放在栈中(Stack)。
(3)值类型的变量声明后,不管是否已经赋值,编译器为其分配内存。
(4)所有的值类型都是Seal类(密封类),无法派生出新的类型。
2.引用类型:
(1)所有的引用类型直接派生于System.Object,包括字符串(String),数据(Array),类(Class),接口(Interface),委托(delegate),基类型(Object)。
(2)引用类型的变量持有的是数据的引用(可以理解为指针,地址),存放在栈(Stack)中,数据存放在堆(Heap)中。
(3)引用类型声明后,只在栈中分配一小片内存用于容纳一个地址,而此时没有在堆上分配内存空间。
(4)当使用new创建一个引用类型的实例时,分配堆上的内存空间,并把堆上空间的地址保存到栈上分配的小片空间中。
3.值类型和引用类型的区别和相同点
相同点:(1)都可以实现接口(结构体也可以实现接口);
区别:(1)引用类型可以派生出新的类型,而值类型不可以
(2)引用类型可以包含null值,而值类型不能
4.值类型变量和引用类型变量的赋值
(1)将值类型的变量赋值给另一个变量,会执行一次赋值,复制的是栈中的数据。
(2)将引用类型的变量赋值给另一个引用类型变量,复制的是引用类型变量存储在栈中的内存地址,在赋值后就会多个变量指向同一个引用对象实例。
Console.WriteLine("#####################下面是值类型和引用类型赋值测试代码#####################");
//值类型赋值
int a = 5;//不赋值,默认值是0
int b = a;
Console.WriteLine($"默认值: a={a},b={b}");
a = 10;
Console.WriteLine($"修改a的值后: a={a},b={b}");
b = 20;
Console.WriteLine($"修改b的值后: a={a},b={b}");
//创建了一个学生类,同时包含姓名字段
//引用类型赋值
Student stu1 = new Student();
stu1.Age = 18;
Student stu2 = stu1;
Console.WriteLine($"默认值: stu1.Age={ stu1.Age}, stu2.Age={stu2.Age}");
stu1.Age = 28;
Console.WriteLine($"修改stu1.age的值后:stu1.Age={ stu1.Age}, stu2.Age={stu2.Age}");
stu2.Age = 38;
Console.WriteLine($"修改stu2.age的值后: stu1.Age={ stu1.Age}, stu2.Age={stu2.Age}");
Console.ReadKey();
运行结果: