一尘不染

是结构始终是堆栈分配的,还是有时是堆分配的?

c#

我的印象是,在C#中,结构元素分配在堆栈上,因此从创建它们的方法返回时消失。但是,如果我将struct-
values放在列表中并返回该值,会发生什么情况?元素得以生存。 有时在堆上分配结构实例吗?

internal struct Stru
{
  public int i;
}

internal class StruTry
{
  public List<Stru> Get(int max)
  {
    var l = new List<Stru>();
    for (int i = 0; i < max; i++)
      l.Add(new Stru {i=i});

    return l;
  }
}

代码打印0、1、2

[Test]
public void T()
{
  var ll = new StruTry().Get(3);
  foreach (var stru in ll)
    Console.WriteLine("* "+ stru.i);
}

阅读 207

收藏
2020-05-19

共1个答案

一尘不染

首先,请阅读Eric Lippert撰写的有关The Stack is an Implementation
Detail的文章
。遵循“关于值类型的真相”。至于你的具体问题

有时在堆上分配结构实例吗?

是的,它们有时分配在堆上。关于何时可以在堆上分配它们的例子很多。如果将它们装箱,或者它们是类中的字段,或者它们是数组的元素,或者它们是已关闭的值类型的变量的值,等等。

但是,如果我将struct-values放在列表中并返回该值,会发生什么情况?元素得以生存。

您正在考虑正确的方法,这是可以在其中分配值类型的显着点之一。有关更多详细信息,请参见我在“关于值类型的真相”中提到的第二篇文章。但是,请记住,堆栈是实现细节。关键要点是,您真的不需要担心这些东西。您应该关注值类型和引用类型之间的语义差异。

2020-05-19