У меня есть следующий код внутри метода 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);
}
В представленном коде Рец [1] остается без изменений. Это связано с тем, что индексатор (который по-прежнему является специальным методом) возвратил копию структуры прямоугольника. В этом случае элементы были расположены на куче . Индексатор возвратил новую копию элемента, поместив новую копию в стек (поскольку Rectangle является типом значения).
Пока все хорошо ...
Позже я создал массив структур Rectangle в классе Program:
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