【发布时间】:2010-10-14 20:10:59
【问题描述】:
我在 main 方法中有以下代码:
List<Rectangle> rects = new List<Rectangle>();
for (int i = 0; i < 5; i++)
{
rects.Add(new Rectangle(1, 1, 1, 1));
}
foreach (Rectangle item in rects)
{
Console.WriteLine(item);
}
rects[1].Inflate(100, 100);
foreach (Rectangle item in rects)
{
Console.WriteLine(item);
}
在呈现的代码中,rects[1] 保持不变。这是因为 indexer(仍然是一个特殊的方法)返回了矩形结构的 copy。在这种情况下,元素位于 heap 上。索引器通过将新的 copy 放在堆栈上返回元素的新 copy(因为 Rectangle 是值类型)。
到目前为止一切都很好......
后来我在 Program 类中创建了一个 Rectangle 结构数组:
Rectangle[] rect = new Rectangle[] { new Rectangle(1, 1, 1, 1), new Rectangle(1, 1, 1, 1) };
在main方法中:
Program p = new Program();
p.rect[1].Inflate(100, 100);
foreach (var item in p.rect)
{
Console.WriteLine(item);
}
我希望 rect 数组的索引器也返回矩形结构的 副本,但这次更改了原始元素(也位于 堆上) .
这是为什么呢?数组索引器是否以不同的方式工作?
亲切的问候 PK
【问题讨论】:
标签: c# stack heap-memory indexer