使用 foreach 迭代对象列表

Iterating a list of objects with foreach

我看到了这个说法:

"When using foreach on a list of objects, the iterated object instance is not editable, but the object properties are editable"

有人可以用一个简单的例子来演示上面的内容吗?

我重新表述一下(因为我找到了两个版本的说法),也许这个说法更清楚:

"When using foreach on a list of elements, the iteration variable that provides the element is readonly, but the element properties are editable"

Foreach (n in list) if (n.something==true) list.Remove(n);

这会失败

你不能删除列表中的项目,不像 for 循环

foreach(var foo in foos)
{
  foo = null; // WRONG, foo is not editable
  foo.name = "John";  // RIGHT, foo properties are editable
}
foreach var car in cars 
{
    //you can edit car.color here
    //you cannot edit car
}

意思是迭代时列表中的项目不能改变,但项目的内容可以。

这将改变集合并阻止 foreach 完成:

foreach(var item in collection)
{
   collection.Remove(item);
}

这将更改列表中的项目,并且不会阻止 foreach 完成:

foreach(var item in collection)
{
    item.name = "Neil";
}

不确定是否需要示例。您将跨过集合中的每个对象,您可以对每个对象执行您喜欢的操作,但不能对集合本身进行更改,例如插入、删除、清除等。尝试这样做会引发异常。