考虑一下:
List<MyClass> obj_list = get_the_list();
foreach( MyClass obj in obj_list )
{
obj.property = 42;
}
是obj
对列表中相应对象的引用,以便当我更改属性时,更改一旦在某处构造后将保留在对象实例中?
Answers:
是的,obj
是对集合中当前对象的引用(假设MyClass
实际上是一个类)。如果您通过引用更改了任何属性,则就像您期望的那样,您也在更改对象。
但是请注意,您不能更改变量obj
本身,因为它是迭代变量。如果尝试,将出现编译错误。这意味着您不能将其为null,并且如果要迭代值类型,则不能修改任何成员,因为那样会更改值。
C#语言规范的状态(8.8.4)
“迭代变量对应于只读局部变量,其范围扩展到嵌入式语句。”
好吧,发生在我遍历var集合时,我的更改没有在foreach循环中更新:
var players = this.GetAllPlayers();
foreach (Player player in players)
{
player.Position = 1;
}
当我将var更改为List时,它开始工作。
也许有趣的是,在C#7.3版中,只要枚举数的Current属性返回引用类型,就可以按引用更改值。以下内容将是有效的(MS文档的普通照会):
Span<int> storage = stackalloc int[10];
int num = 0;
foreach (ref int item in storage)
{
item = num++;
}
在C#foreach语句中了解有关此新功能的更多信息 | 微软文档。
obj是对列表中某个项目的引用,因此,如果更改它的值,它将保持不变。现在,您应该关注的是是否get_the_list();。正在制作列表的深层副本或返回相同的实例。