我有一个简单的类,它有布尔字段:
public struct Foo { bool isAvailable; }
Run Code Online (Sandbox Code Playgroud)
现在我有一个foos列表:
List < Foo > list = new List< Foo >();
Run Code Online (Sandbox Code Playgroud)
稍后,我枚举列表中的每个foo并尝试更新其isAvailable字段:
foreach(Foo foo in list) {
foo.isAvailable = true;
}
Run Code Online (Sandbox Code Playgroud)
但上面的代码永远不会更新列表.我在这里做错了什么,它的补救措施是什么.
这是因为它Foo
是一个可变的结构.
当您从列表中获取值时,它正在制作副本 - 因为这是值类型的行为方式.您正在更改副本,保持原始值不变.
建议:
虽然您可以更改代码以不同的方式迭代列表并每次替换值,但这通常是一个坏主意.只需使用一个类......或将您的列表投影到具有适当值的新列表.
原来的答案,当Foo是一个班级
它应该工作正常.例如,这是一个简短但完整的程序,它可以工作:
using System.Collections.Generic;
public class Foo
{
public bool IsAvailable { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Name + ": " + IsAvailable;
}
}
class Test
{
static void Main()
{
List<Foo> list = new List<Foo>()
{
new Foo { Name = "First", IsAvailable = true },
new Foo { Name = "Second", IsAvailable = false },
new Foo { Name = "Third", IsAvailable = false },
};
Console.WriteLine("Before:");
list.ForEach(Console.WriteLine);
Console.WriteLine();
foreach (Foo foo in list)
{
foo.IsAvailable = true;
}
Console.WriteLine("After:");
list.ForEach(Console.WriteLine);
}
}
Run Code Online (Sandbox Code Playgroud)
尝试到您当前密码适应类似的短但完整的程序,它不工作,那后,我们可以计算出发生了什么事情.
归档时间: |
|
查看次数: |
421 次 |
最近记录: |