foreach迭代变量是否可以因任何原因而改变?

时间:2013-12-20 11:51:09

标签: c# foreach

我有一个带有名为“rcnesw”的迭代变量的foreach语句。

foreach( RCNESW rcnesw in shiftersave )
{
    TestG.ShiftQuad( rcQuads, rcnesw.row, rcnesw.col, GO_.Up);

    // other code...
}

在调试Shiftcad时调用rcnesw.row和rcnesw.col CHANGE 的值 - 我认为foreach循环变量是readonly。是不是只读了?

注意:TestG.ShiftQuad方法中还有一个foreach循环,它有自己的本地(我认为是本地)变量,它具有相同的名称和类型:RCNESW rcnesw。该值似乎会传回到调用的foreach位置。

(=====编辑=====添加=====)

首先,感谢所有关于“readonly”变量的“可变”性质的信息。这澄清了情况(C#/ .NET文档没有)。

关于ShiftQuad方法的更多信息,它是:

public void ShiftQuad( List<RCPair> rcList, int row, int col, int dir )

在该方法中没有更改行或列。 ShiftQuad声明自己的rcnesw:

RCNESW rcnesw = null;

还是吗?该声明是否不会创建RCNESW的新实例?因为当该方法使rcnesw.row和rcnesw.col发生变化时,调用方法显然会收到这些变化。

public class RCNESW
{
    public int row;
    public int col;
    public bool bNorth;
    public bool bEast;
    public bool bSouth;
    public bool bWest;
}

此时我仍然认为这是一个编译器错误。不应通过值调用的变量在调用者处显示对局部变量的更改。

(====编辑====解决===) 这个问题实际上与本地与非本地(或通过值传递)无关,关键在于某些列表如何成为相同对象的别名。

3 个答案:

答案 0 :(得分:8)

每当你在C#中遇到只读概念时,它几乎总是一种只读的浅层形式 - 你不能改变变量所引用的对象,但你可以对该对象进行更改自己的属性(或调用方法等)

同样适用于类的readonly字段 - 您无法更改引用,但可以改变对象。

答案 1 :(得分:2)

在循环体中

foreach( RCNESW rcnesw in shiftersave )

循环变量rcnesw是只读的,但究竟是什么意思在很大程度上取决于RCNESW是引用类型(类类型,接口类型,委托类型,数组类型)还是值type(struct type,enum type)。

如果RCNESW是引用类型,则唯一不能变异的是rcnesw的值,它是引用。因此rcnesw引用哪个对象的“身份”不能改变。但是,同一个对象的状态可能会发生巨大变化;那里没有限制。

答案 2 :(得分:1)

显然,您可以更改foreach循环的每次迭代所引用的对象的对象属性。

您不应该更改集合。引用MSDN

  

foreach语句用于遍历集合以获取所需的信息,但不能用于添加或删除源集合中的项目以避免不可预测的副作用。如果需要在源集合中添加或删除项目,请使用for循环。