我的印象是,在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); }
首先,请阅读Eric Lippert撰写的有关The Stack is an Implementation Detail的文章。遵循“关于值类型的真相”。至于你的具体问题
有时在堆上分配结构实例吗?
是的,它们有时分配在堆上。关于何时可以在堆上分配它们的例子很多。如果将它们装箱,或者它们是类中的字段,或者它们是数组的元素,或者它们是已关闭的值类型的变量的值,等等。
但是,如果我将struct-values放在列表中并返回该值,会发生什么情况?元素得以生存。
您正在考虑正确的方法,这是可以在其中分配值类型的显着点之一。有关更多详细信息,请参见我在“关于值类型的真相”中提到的第二篇文章。但是,请记住,堆栈是实现细节。关键要点是,您真的不需要担心这些东西。您应该关注值类型和引用类型之间的语义差异。