c# - foreach 迭代变量不能因为任何原因而改变吗?

标签 c# foreach

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

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

    // other code...
}

在调试调用 ShiftQuad 后 rcnesw.row 和 rcnesw.col CHANGE 的值时——我认为 foreach 循环变量是只读的。它永远不是只读的吗?

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

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

首先,感谢大家提供有关“只读”变量的“可变”性质的信息。这说明了情况(C#/.NET 文档没有说明)。

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

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

并且在该方法中没有改变行或列。 ShiftQuad 声明自己的 rcnew:

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 字段 - 您不能更改引用,但可以改变对象。

关于c# - foreach 迭代变量不能因为任何原因而改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20703050/

相关文章:

c# - 在 Unity 中使用反射注册通用类型

c# - 一个Commandhandler用于多个MenuItem

php foreach 循环,无法将值分配给正确的变量名?

PHP 数组 - 一个 'set where key=?' 类型的函数?

php - 如何将多个逗号分隔的列表分解为单个 foreach?

javascript - 在使用 forEach 然后过滤查询后,通过 JavaScript 中的下拉列表进行过滤不会抛出任何结果

c# - 在多行文本框中显示 ArrayList 条目

c# - 在这种情况下嵌套 LINQ 查询?如何创建嵌套的groupby?

c# - .NET 是否可以在进程之间共享大型内存中的集合?

c# - 使用带有 ASP.NET 的 OpenXML SDK 在内存中流式传输 Word 文档会生成 "corrupt"文档