【发布时间】:2021-08-17 17:04:15
【问题描述】:
来自this question 我明白了
- 结构可以分配在栈上或寄存器中,而不是堆上
- 如果结构是堆上引用类型对象的一部分,则该结构也将在堆上
但是如果结构体不是对象的一部分,而是类的静态成员,那么呢:
public class Program
{
public static CustomStructType inst1;
static void Main(string[] args)
{
//assigning an instance of value type to the field
inst1 = new CustomStructType();
}
}
public struct CustomStructType
{
//body
}
堆上不会有Program 的实例。那么结构体将存储在哪里?
这个问题是this deleted question 的改写版本。该用户已被删除,因此问题和答案随之而来。我还是觉得这个想法很有趣,调试结果更有趣,所以我选择在这里重复。
关于潜在的重复:
- this question 创建一个类的实例。如前所述,我知道作为对象一部分存储的结构在堆上。我的代码没有创建类的实例。
- this question 让它保持打开状态,不管它是否是静态的,答案是“不,如果你在 Main 内部这样做,一般来说,它不会在堆上分配。”
-
this question Jon Skeet 给出了一个很好的答案,他说每个
new都会在堆栈上分配空间。
【问题讨论】:
-
哪个 dotnet 的哪个版本?你为什么想知道?
-
@HenkHolterman:非常有效的问题。我想已删除问题的 OP 认为它在不同版本中可能会有所不同。我希望我的答案是独立于版本的,它不包括堆栈并注册为有效的存储位置。为什么有人想知道?我会说,出于教育/学习目的和正确理解。我个人在现实生活中从未关心过它,也从未遇到过问题:-)
-
@PeterDuniho:Eric Lippert 提到了它,但既没有证据也没有解释为什么会这样。而且,正如问题中提到的,当前副本的代码创建了一个实例,而这个问题的代码没有创建一个实例。
-
@EricLippert:您在这 3 个 cmets 中写的内容非常好,可以理解静态变量不存在于堆栈而不存在于寄存器中的原因。这足以证明。埃里克,我认识你,我知道你永远不会回答你不能 100% 确定的问题。
-
@EricLippert:您在链接答案中写的句子只是那里的一个句子。它与原始问题有直接关系。它只是为了正确性和完整性。这很棒。然而,这个问题是专门针对静态结构的,所以我不仅想在某处有一个正确的句子,而且至少提供一个逻辑解释为什么它必须是这样的。
标签: c# memory-management stack heap-memory value-type