我的印象是,在 C# 中,结构元素是在堆栈上分配的,因此从创建它们的方法返回时会消失。但是如果我将结构值放入列表中并返回它会发生什么?元素得以幸存。结构体实例有时会分配在堆上吗?
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 的这篇文章堆栈是一个实现细节。跟随它关于值类型的真相。
至于你的具体问题
结构体实例有时会分配在堆上吗?
是的,它们有时分配在堆上。有很多关于何时可以在堆上分配它们的示例。如果它们被装箱,或者它们是类中的字段,或者它们是数组的元素,或者它们是已封闭的值类型变量的值,等等。
但是如果我将结构值放入列表中并返回它会发生什么?元素得以幸存。
您正在以正确的方式思考这一点,这是可以分配值类型的要点之一。有关更多详细信息,请参阅我在关于值类型的真相中提到的第二篇文章。但请记住堆栈是一个实现细节。关键的一点是你真的不需要关心这些东西。您应该关注值类型和引用类型之间的语义差异。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)