值类型,引用类型都是C#中的两种数据类型
值类型被分配在栈中,引用类型分配在堆上。我们平时New的对象就是通过引用地址指向堆中的内存。
值类型一经声明,编译器就会为其分配一块内存空间
引用类型声明后会在栈上开辟一小块空间用于存放引用地址,对象实例化后会为其堆上分配空间,并把堆上地址保存到栈上
class Person { public int Age { get; set; } } struct Student { public int Age { get; set; } }
如上:声明一个Person类class和一个Student结构体struct
Person p1 = new Person(); p1.Age = 18; Person p2 = p1; p2.Age = 28; Console.WriteLine(p1.Age); Console.WriteLine(ReferenceEquals(p1,p2));
如上:创建一个对象p1并为属性赋值→把p1赋值给p2 →修改p2的属性→结果为 28,true
可以看出p1和p2指向的是同一块堆地址,p2变化了同时引起了p1的变化。
Student s1 = new Student(); s1.Age = 18; Student s2 = s1; s2.Age = 28; Console.WriteLine(s1.Age); Console.WriteLine(ReferenceEquals(s1, s2));
如上:创建一个对象s1并为属性赋值→把s1赋值给s2 →修改s2的属性→结果为 18,false。
用于结构体struct是值类型,s1赋值给s2是把s1拷贝了一份放在栈上。这样当s2变化的时候是不影响s1的