我在 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(仍然是一种特殊方法)返回了矩形结构的副本。在这种情况下,元素位于heap上。索引器通过将新副本放在堆栈上返回元素的新副本(因为 Rectangle 是值类型)。
到现在为止还挺好...
后来我在 Program 类中创建了一个 Rectangle 结构数组:
Rectangle[] rect = new Rectangle[] { new Rectangle(1, 1, 1, 1), new Rectangle(1, 1, 1, 1) };
在主要方法中:
Program p = new Program();
p.rect[1].Inflate(100, 100);
foreach (var item in p.rect)
{
Console.WriteLine(item);
}
我希望 rect 数组的索引器也返回矩形结构的副本,但是这次更改了原始元素(也位于堆上)。
这是为什么?数组索引器是否以不同的方式工作?
亲切的问候 PK