41.自定义类和结构体成员变量的存储位置

  1. 41.自定义类和结构体成员变量的存储位置
    1. 41.1 题目
    2. 41.2 深入解析
    3. 41.3 答题示例
    4. 41.4 关键词联想

41.自定义类和结构体成员变量的存储位置


41.1 题目

  1. 在自定义类中声明的成员变量,类型为int,该int变量存储在栈上还是堆上?
  2. 在自定义结构体中声明的成员变量,类型为string,该string变量存储在栈上还是堆上?

41.2 深入解析

  1. 堆上

在自定义类中声明的成员变量,无论其类型如何,都会存储在堆上。类是引用类型,其实例存储在堆上,成员变量也存储在该实例所指向的内存区域(堆上)。

public class MyClass
{
    public int myInt; // 存储在堆上
}

public class Example
{
    public void Test()
    {
        MyClass obj = new MyClass();
        obj.myInt = 10; // myInt 存储在堆上
    }
}
  1. 堆上

在结构体变量中的引用类型成员实际上会存储在堆上。虽然结构体本身是值类型,存储在栈上,但如果结构体的成员包含引用类型,那么引用类型的对象会存储在堆上,而结构体的实例内部会包含对这些堆上对象的引用。

public struct MyStruct
{
    public string myString; // myString 的内容存储在堆上
}

public class Example
{
    public void Test()
    {
        MyStruct myStruct = new MyStruct();
        myStruct.myString = "Hello"; // myString 的实际字符串内容存储在堆上
    }
}

41.3 答题示例

  1. 堆上:在自定义类中声明的 int 成员变量存储在堆上。因为类是引用类型,其实例在堆上分配内存,所有成员变量(无论值类型还是引用类型)都作为实例的一部分存储在堆中。
  2. 堆上:在结构体中声明的 string 成员变量,其实际内容存储在堆上。结构体是值类型,若实例在栈上分配(如局部变量),结构体本身存储在栈,但 string 作为引用类型,其指向的字符串对象始终在堆上,结构体中仅保存指向堆对象的引用。若结构体作为类的成员,则整个结构体实例会存储在堆上。

41.4 关键词联想

  • 值类型 vs 引用类型
  • 堆内存(Heap)
  • 栈内存(Stack)
  • 类(Class)与结构体(Struct)
  • 成员变量存储
  • 引用类型的内存布局
  • 字符串驻留(String Interning)
  • 内存分配
  • 值类型嵌套引用类型


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏