foreach迭代变量可以因为任何原因而不更改吗



我有一个foreach语句,其中有一个名为"rcnesw"的迭代变量。

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

在调试rcnesw.row和rcnesw.col的值时,由于调用ShiftQuad,CHANGE的结果——我认为foreach循环变量是只读的。它曾经不是只读的吗?

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

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

首先,感谢所有关于"只读"变量的"可变"性质的信息。这澄清了这种情况(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;
}

在这一点上,我仍然认为这是一个编译器错误。对局部变量的更改不应通过由值调用的变量出现在调用者处。

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

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

这同样适用于类的readonly字段——您不能更改引用,但可以更改对象。

在循环的主体中

foreach( RCNESW rcnesw in shiftersave )

循环变量rcnesw是只读的,但这意味着什么在很大程度上取决于RCNESW是引用类型(类类型、接口类型、委托类型、数组类型)还是值类型(结构类型、枚举类型)。

如果RCNESW是引用类型,那么唯一不能突变的是作为引用的rcnesw的值。因此,rcnesw引用的对象的"身份"不会改变。然而,同一物体的状态可能会发生巨大变化;没有限制。

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

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

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

最新更新