Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象中的值类型也存储在堆中?_C#_Stack_Heap Memory - Fatal编程技术网

C# 对象中的值类型也存储在堆中?

C# 对象中的值类型也存储在堆中?,c#,stack,heap-memory,C#,Stack,Heap Memory,我可以想象这个问题已经被问了几千次了,但是我没有太多的运气找到答案,而且这更多的是出于好奇而不是需要 深入研究C#的细节,我想知道,既然对象存储在堆中,那么对象中的值类型是否也存储在堆中,或者它们是否放置在堆栈中?这些值类型与对象本身一起存储在堆中。考虑这一点的一个好方法是,当一个对象(其状态中包含值类型)被分配到堆上时,它的值类型也必须存在于该堆中,否则这些值类型将在创建该对象的代码的堆栈展开时立即消失。是的,它们作为堆的一部分存储。然而,正如Eric Lippert在多个场合所描述的,这都是

我可以想象这个问题已经被问了几千次了,但是我没有太多的运气找到答案,而且这更多的是出于好奇而不是需要


深入研究C#的细节,我想知道,既然对象存储在堆中,那么对象中的值类型是否也存储在堆中,或者它们是否放置在堆栈中?

这些值类型与对象本身一起存储在堆中。考虑这一点的一个好方法是,当一个对象(其状态中包含值类型)被分配到堆上时,它的值类型也必须存在于该堆中,否则这些值类型将在创建该对象的代码的堆栈展开时立即消失。

是的,它们作为堆的一部分存储。然而,正如Eric Lippert在多个场合所描述的,这都是一个实现细节。我建议你阅读他的博客文章,这是最近的一篇,也很重要。

它们存储在堆中,在为引用类型分配的内存中。此外但是,CLI规范没有指定存储值类型的内存池所在的位置—这是一个不重要的实现细节。

Andrew Hare说得对。有关详细信息,请参阅:

我被“价值类型在堆栈上”的神话所困扰。。。这通常是错误的:语句应该是“值类型可以存储在堆栈上”,而不是更常见的“值类型总是存储在堆栈上”


好文章,谢谢!顺便说一句,我喜欢你的书,现在正好在读!