我有一个带有名为“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;
}
此时我仍然认为这是一个编译器错误。不应通过值调用的变量在调用者处显示对局部变量的更改。
(====编辑====解决===) 这个问题实际上与本地与非本地(或通过值传递)无关,关键在于某些列表如何成为相同对象的别名。
答案 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循环。