41.自定义类和结构体成员变量的存储位置
41.1 题目
- 在自定义类中声明的成员变量,类型为int,该int变量存储在栈上还是堆上?
- 在自定义结构体中声明的成员变量,类型为string,该string变量存储在栈上还是堆上?
41.2 深入解析
- 堆上
在自定义类中声明的成员变量,无论其类型如何,都会存储在堆上。类是引用类型,其实例存储在堆上,成员变量也存储在该实例所指向的内存区域(堆上)。
public class MyClass
{
public int myInt; // 存储在堆上
}
public class Example
{
public void Test()
{
MyClass obj = new MyClass();
obj.myInt = 10; // myInt 存储在堆上
}
}
- 堆上
在结构体变量中的引用类型成员实际上会存储在堆上。虽然结构体本身是值类型,存储在栈上,但如果结构体的成员包含引用类型,那么引用类型的对象会存储在堆上,而结构体的实例内部会包含对这些堆上对象的引用。
public struct MyStruct
{
public string myString; // myString 的内容存储在堆上
}
public class Example
{
public void Test()
{
MyStruct myStruct = new MyStruct();
myStruct.myString = "Hello"; // myString 的实际字符串内容存储在堆上
}
}
41.3 答题示例
- 堆上:在自定义类中声明的
int成员变量存储在堆上。因为类是引用类型,其实例在堆上分配内存,所有成员变量(无论值类型还是引用类型)都作为实例的一部分存储在堆中。- 堆上:在结构体中声明的
string成员变量,其实际内容存储在堆上。结构体是值类型,若实例在栈上分配(如局部变量),结构体本身存储在栈,但string作为引用类型,其指向的字符串对象始终在堆上,结构体中仅保存指向堆对象的引用。若结构体作为类的成员,则整个结构体实例会存储在堆上。
41.4 关键词联想
- 值类型 vs 引用类型
- 堆内存(Heap)
- 栈内存(Stack)
- 类(Class)与结构体(Struct)
- 成员变量存储
- 引用类型的内存布局
- 字符串驻留(String Interning)
- 内存分配
- 值类型嵌套引用类型
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com