只读列表覆盖自身

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();

另一种方法是使用 structs,因为我假设 Position 有 X 和 Y 坐标,所以使用 struct 和 X 和 Y 更符合逻辑,然后分配将复制数据,而不是在源中以任何方式更改它。它也很可能使代码更清晰。

List 不是只读的。 List 不能是只读的。 属性 是只读的。这意味着您不能为 属性 分配不同的 List 对象,但是一旦您从 属性 获得 List 对象,它就像任何其他 List,所以你可以随意修改。如果您希望集合是只读的,请使用 ReadOnlyCollection 而不是 List.