C#中的值类型和引用类型
存储位置
1.值类型的变量以及其值都存放在栈上面的。
以图所示,值类型num_a 的值修改并不会影响或原有的变量num_b 。
int num_a = 3;//num_a 是值类型,变量跟值都存放在栈中。栈中存放示例:num_a = 3 int num_b = num_a;//num_b 是值类型,变量跟值都存放在栈中。栈中存放示例:num_b = 3.即另外在栈内存开辟新的内存空间 num_a = 4; Console.WriteLine(num_b);//输出结果为3
2.引用类型的变量存储在栈上面,其值则放在堆上面。
如上图代码,stu_a与stu_b指向堆上面的同一个地址,所以当stu_a修改后,stu_b相应也会发生变化。
public class Student { public string Name { get; set; } public Student(string name) { this.Name = name; } } var stu_a = new Student("张三"); var stu_b = stu_a; Console.WriteLine(stu_b.Name);//stu_b 输出结果"张三" stu_a.Name = "李四"; Console.WriteLine(stu_b.Name);//stu_b 输出结果"李四"
注意:
字符串string比较特殊这个需要注意,字符窜是引用类型,但是它具有不可变性。如下代码所示:
//特殊例子 字符串 string str_a = "代码改变世界"; string str_b = str_a; Console.WriteLine(string.ReferenceEquals(str_a,str_b));//输出true str_a = "科技改变生活"; Console.WriteLine(string.ReferenceEquals(str_a, str_b));//输出false
当修改str_a的值时会创建一个新的字符串对象,并会分配一个新的引用.
所以修改str_a的值后,str_a和str_b的引用就不一致了。
分类:
值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
引用类型包括:数组,用户定义的类、接口、委托,object,字符串,数组。

浙公网安备 33010602011771号