gpt4 book ai didi

c# - 具有引用成员的结构 : heap or stack?

转载 作者:太空狗 更新时间:2023-10-29 22:26:26 28 4
gpt4 key购买 nike

众所周知,structvalue type , 因此分配在堆栈上(除了特定情况,例如它被装箱在一个类中)。

然而,让我们考虑这个 struct :

public struct TestStruct
{
public List<int> items;
}

internal class Program
{
private static void Main(string[] args)
{
TestStruct g;
}
}

我们的 TestStruct g不是类的成员,而是在 Main 中声明的“独立”变量功能。它符合 stack 的要求-分配的变量。

但是,如果我写:

g.items = new List<int>();
  1. 我想 items分配在 heap 上不是吗?是否g “去”在 heap 上还有吗?
  2. items 会发生什么什么时候g超出范围(即 GC必须为items做它的工作)?
  3. 如果不是 List<int> 会怎么样我们有一个类型的变量实现 IDisposable , 最好的行动方案是什么?

PS:我知道可以(应该?)使用 class在这种情况下,而不是 struct .我只是对这个具体案例感到困惑。

最佳答案

I suppose items is allocated on the heap isn't it?

是的。 items 的内存将在堆上分配。

Does g "go" on the heap as well?

不,结构保留在堆栈上。它只有一个字段,该字段保存对堆上 items 列表的引用。

What happens for items when g goes out of scope (i.e. does the GC have to do its job for items)?

如果 g 超出范围,则应用程序根目录中将没有对 items 的引用。项目将成为垃圾,并在下一次垃圾收集期间由 GC 收集。在那之前,items 将保留在内存中(当您退出使用它的方法时,struct 实例将被删除)。

What if instead of a List we had a variable of type implementing IDisposable, what would be the best course of action?

最佳操作是通过您的结构实现 IDisposable。更新:实际上正如@MarcGravell 指出的那样——如果可能的话,在这种情况下最好不要使用 struct。

关于c# - 具有引用成员的结构 : heap or stack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23628234/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com