您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么C#foreach语句中的Iteration变量是只读的?

为什么C#foreach语句中的Iteration变量是只读的?

让我们从一个愚蠢但说明性的示例开始:

Object o = 15;
o = "apples";

我们从来没有感觉到我们只是将数字15变成了一串苹果。我们知道那o仅仅是一个指针。现在,以迭代器形式进行操作。

int[] nums = { 15, 16, 17 };

foreach (Object o in nums) {
     o = "apples";
}

再一次,这真的什么也做不了。或至少编译它 不会 完成任何工作。它当然不会将我们的字符串插入到int数组中- 这是不允许的,而且我们知道这o仍然只是一个指针。

让我们举个例子:

foreach (Position Location in Map)
{
     //We want to fudge the position to hide the exact coordinates
     Location = Location + Random();     //Compiler Error

     Plot(Location);
}

如果要进行编译,则Location在您的示例中,会突出显示引用中的值Map,然后您将其更改为引用一个新值Position(由加法运算符隐式创建)。从功能上讲,它等效于此(可以编译):

foreach (Position Location in Map)
{
     //We want to fudge the position to hide the exact coordinates
     Position Location2 = Location + Random();     //No more Error

     Plot(Location2);
}

那么,为什么Microsoft禁止您重新分配用于迭代的指针?一件事很清楚- 您不希望有人指派他们以为他们在循环中已经改变了您的位置。易于实施:变量可能隐藏一些内部逻辑,以指示正在进行的循环状态。

但更重要的是,您没有理由 分配给它。它代表循环序列的当前元素。如果您遵循“编码恐怖”,则为其分配值将违反“单一责任原则”或@L_419_0@。变量仅意味着一件事。

c# 2022/1/1 18:14:38 有478人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶