只读列表覆盖自身
readonly list overriding itself
我有一个包含一些坐标的只读列表。
private readonly List<float[]> rightPositions = new List<float[]>()
{
new float[2] { 250, 0 },
new float[2] { 350, -200 },
new float[2] { 350, 200 },
new float[2] { 600, 0 }
};
在下面的方法中,我将 List<float[]> rightPositions
中的静态数据提供给字段 rTeam.PlayerArray[iterator].Position
。
private void ClearPlayers(Team rTeam, Team lTeam)
{
for (int iterator = 0; iterator < rTeam.PlayerArray.Length; iterator++)
{
rTeam.PlayerArray[iterator].Position = rightPositions.ElementAt(iterator);
}
}
第一次执行ClearPlayers(Team rTeam, Team lTeam)
时,List<float[]> rightPositions
中的数据被放入rTeam.PlayerArray[iterator].Position
中。第一次之后,readonly里的数据List<float[]> rightPositions
跟以前不一样了
我是不是漏掉了什么明显的东西?或者我是否需要使用除只读字段之外的其他内容?
提前致谢。
readonly
仅表示"you cannot change the value of this variable."您可以更改列表中的任何内容,但不能创建新列表。
它也不会改变实际内容的工作方式。您创建浮点数组,将它们分配到某处,它们仍然指向同一个数组,因此您对它们所做的任何更改都会影响此列表中的数组。
如果要防止数组发生变化,则必须克隆数组。
rTeam.PlayerArray[iterator].Position = (float[])rightPositions.ElementAt(iterator).Clone();
另一种方法是使用 struct
s,因为我假设 Position
有 X 和 Y 坐标,所以使用 struct
和 X 和 Y 更符合逻辑,然后分配将复制数据,而不是在源中以任何方式更改它。它也很可能使代码更清晰。
List
不是只读的。 List
不能是只读的。 属性 是只读的。这意味着您不能为 属性 分配不同的 List
对象,但是一旦您从 属性 获得 List
对象,它就像任何其他 List
,所以你可以随意修改。如果您希望集合是只读的,请使用 ReadOnlyCollection
而不是 List
.
我有一个包含一些坐标的只读列表。
private readonly List<float[]> rightPositions = new List<float[]>()
{
new float[2] { 250, 0 },
new float[2] { 350, -200 },
new float[2] { 350, 200 },
new float[2] { 600, 0 }
};
在下面的方法中,我将 List<float[]> rightPositions
中的静态数据提供给字段 rTeam.PlayerArray[iterator].Position
。
private void ClearPlayers(Team rTeam, Team lTeam)
{
for (int iterator = 0; iterator < rTeam.PlayerArray.Length; iterator++)
{
rTeam.PlayerArray[iterator].Position = rightPositions.ElementAt(iterator);
}
}
第一次执行ClearPlayers(Team rTeam, Team lTeam)
时,List<float[]> rightPositions
中的数据被放入rTeam.PlayerArray[iterator].Position
中。第一次之后,readonly里的数据List<float[]> rightPositions
跟以前不一样了
我是不是漏掉了什么明显的东西?或者我是否需要使用除只读字段之外的其他内容?
提前致谢。
readonly
仅表示"you cannot change the value of this variable."您可以更改列表中的任何内容,但不能创建新列表。
它也不会改变实际内容的工作方式。您创建浮点数组,将它们分配到某处,它们仍然指向同一个数组,因此您对它们所做的任何更改都会影响此列表中的数组。
如果要防止数组发生变化,则必须克隆数组。
rTeam.PlayerArray[iterator].Position = (float[])rightPositions.ElementAt(iterator).Clone();
另一种方法是使用 struct
s,因为我假设 Position
有 X 和 Y 坐标,所以使用 struct
和 X 和 Y 更符合逻辑,然后分配将复制数据,而不是在源中以任何方式更改它。它也很可能使代码更清晰。
List
不是只读的。 List
不能是只读的。 属性 是只读的。这意味着您不能为 属性 分配不同的 List
对象,但是一旦您从 属性 获得 List
对象,它就像任何其他 List
,所以你可以随意修改。如果您希望集合是只读的,请使用 ReadOnlyCollection
而不是 List
.