目录
值对象与引用对象的存储
引用对象的成员存储
值对象与引用对象的存储
数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。
C#中类型分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。
- 值类型住需要一段单独的内存,用于存储实际的数据
- 引用类型需要两段内存
- 第一段存储实际的数据,它总是在堆中。
- 第二段是一个引用,指向数据在堆中的存放位置
示例如下:
引用对象的成员存储
如果存储了一个对象,该对象有多个成员,成员既有值对象又有引用对象时,存储情况如何呢?
- 首先,引用类型对象的数据部分始终存放在堆里
- 值类型对象,或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,这依赖于实际环境。
例如有这么一个类:
public class Student(int age, string name)
{
public int Age { get; set; } = age;
public string Name { get; set; } = name;
}
当你在主函数中声明一个类对象时:
Student student = new Student(18, "小王");
首先,构造student对象用了new,所以student的实例数据存储在堆上,其引用部分放在堆里。
那么Age成员是值类型是否会被放在栈里呢?
答案是否定的。
请记住一个引用类型,其实例数据部分始终存放在堆里,既然两个成员都是对象数据的一部分,那么他们都会被存放在堆里,无论他们诗值类型还是引用类型。
- 尽管Age是值类型,但是它也是student实例数据的一部分,因此和对象的数据一起被存放在堆里
- Name是引用类型,所以它的数据部分始终会存放在堆里,不同的是,它的引用部分也被存放在堆里,封装在Student对象的数据部分。
记住上面的两张图,搞不清楚时,自己划一下,以后分析值对象和引用对象在内存的位置就心里有数了