System.Drawing.Point
- это структура - тип значения.Цикл foreach
копирует значение Point
из коллекции в переменную p
.Затем вы изменяете переменную p
, вызывая Offset
, но это совсем не меняет коллекцию, потому что изменяется только копия .
Во втором цикле,вы изменяете значение в массиве напрямую - вот почему вы видите разницу.
Более идиотский способ сделать это:
for (int i = 0; i < MyPoints.Length; i++)
{
MyPoints[i].Offset(5, 2);
}
Стоит отметить, чтоPoint
относительно необычен, так как это тип значения mutable - метод Offset
действительно изменяет значение.Большинство типов значений (например, DateTime
) являются неизменяемыми - такие методы, как AddDays
, не изменяют значение, к которому они обращаются;вместо этого они возвращают новое значение.Таким образом, чтобы сделать нечто подобное с массивом дат, вам понадобится такой код:
for (int i = 0; i < dates.Length; i++)
{
dates[i] = dates[i].AddDays(10);
}
Или вы можете использовать LINQ для создания нового массива:
DateTime[] newDates = dates.Select(date => date.AddDays(10)).ToArray();
Вы не могли быне пишите точно так же для Point
, потому что Offset
возвращает void
.Вам нужно что-то вроде:
Point[] newPoints = points.Select(point => { point.Offset(5,2); return point; })
.ToArray();