当我使用数组时struct
s(例如 System.Drawing.Point),我可以通过索引获取项目并更改它。
例如(此代码工作正常):
Point[] points = new Point[] { new Point(0,0), new Point(1,1), new Point(2,2) };
for (int i = 0; i < points.Length; i++)
{
points[i].X += 1;
}
但是当我使用 List 时它不起作用:
无法修改返回值
'System.Collections.Generic.List.this[int]'
因为它不是变量
示例(此代码无法正常工作):
List<Point> points = new List<Point> { new Point(0,0), new Point(1,1), new Point(2,2) };
for (int i = 0; i < points.Count; i++)
{
points[i].X += 1;
}
我知道当我按索引获取列表项时,我得到了它的副本,并且编译器提示我没有犯错误,但为什么采用数组索引的元素的工作方式不同?
这是因为对于array points[i]
shows where对象已定位。换句话说,基本上points[i]
对于一个数组来说是一个pointer在记忆中。您因此执行操作记录在案的在内存中,而不是在某些副本上。
情况并非如此List<T>
:它在内部使用数组,但通过方法进行通信,导致这些方法将从内部数组中复制值,并且显然修改这些副本没有多大意义:您会立即忘记它们,因为您没有编写复制回内部数组。
正如编译器建议的那样,解决此问题的一种方法是:
(3,11): error CS1612: Cannot modify a value type return value of `System.Collections.Generic.List<Point>.this[int]'. Consider storing the value in a temporary variable
所以你可以使用以下“trick":
List<Point> points = new List<Point> { new Point(0,0), new Point(1,1), new Point(2,2) };
for (int i = 0; i < points.Count; i++) {
Point p = points[i];
p.X += 1;
points[i] = p;
}
因此,您将副本读入临时变量,修改副本,然后将其写回List<T>
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)