c# - 引用空间创建的变量将存储在哪里?他们将如何被引用到他们的参考空间?
问题描述
我读到局部变量将存储在堆栈内存中,而引用变量将存储在堆内存中。
现在我有一个在参考空间中创建本地对象的情况。那么该对象将保存在哪里,该对象将如何被引用呢?
我试图找出哪些变量存储在堆栈内存和堆内存中。
员工.cs
class Employee
{
int EmpId;
public int GetEmpId()
{
return this.EmpId ;
}
public void SetEmpId(int EmpId)
{
this.EmpId = EmpId;
}
public Job j = new Job();
}
作业.cs
class Job
{
int JobId;
public int GetJobId()
{
return this.JobId ;
}
public void SetJobId(int JobId)
{
this.JobId = JobId;
}
}
程序.cs
class Program
{
static int a =1;
static void Main(string[] args)
{
Employee E1 = new Employee();
Employee E2 = new Employee();
E1.SetEmpId(2595);
E1.j.SetJobId(25);
Console.WriteLine(E1.GetEmpId());
Console.WriteLine(E1.j.GetJobId());
}
}
我正在使用 Visual Studio 代码。
谁能帮我找出堆栈内存中的内容和堆内存中的内容?
解决方案
堆栈空间用于将参数传递给方法和定义的局部变量。引用类型的局部变量将存储在堆上,指向该对象的指针将存储在堆栈上。但是,值类型的局部变量将存储在堆栈中。
顺便说一句,堆栈空间归线程所有。默认堆栈大小为 1MB。每个线程都有一个堆栈,而应用程序通常只有一个堆。
对象与它们的所有字段和属性一起存储在堆中。
现在,让我们逐行进行。
static int a = 1;
静态字段将与Type
对象一起存储在堆中。因为,实际上与Type
对象相关的静态字段将由 CLR 在首次访问该实例Type
或直接访问Type
. 该Type
对象包含所有类型相关的信息。
然后:
Employee E1 = new Employee();
Employee E2 = new Employee();
堆上有两个Employee
对象。以及堆栈中该对象的地址(E1
和E2
)。但是,如果Employee
是一个结构,那么E1
和E2
将与所有信息一起存储在堆栈中。如果该结构具有引用类型的某些字段,则该字段的数据将存储在堆中,该字段的地址将存储在内部的堆栈中Employee
。
推荐阅读
- regex - 如何使用正则表达式去除数字后的所有文本并将数字包含在列中
- python - Django 依赖/链式下拉/组合列表
- javascript - 如何检查图像是否加载到 React 的骨架功能工作流程中
- flutter - dart 中字符串方法的奇怪行为
- javascript - 通话结束后可以自动打开 PWA 应用吗
- react-native - React Native iOS:打包程序在物理设备上的加载速度比在模拟器上慢得多
- c# - 匹配字符串模板的正则表达式
- azure - 无法在 databricks 笔记本上读取 spark 临时表数据
- javascript - bootstrap 是否有带有时间框架选项的图表组件?
- csv - 如何在 Julia 中放置列名并将新闻文件 .csv 放在 Julia 语言中的第二、第三等列中?