这总是正确吗?
让我们列出一个清单,并在其上调用一个功能函数,例如“查找”。在查找过程中,另一个线程将引用“列表”更新为新列表。这对“查找”结果或集合的任何其他成员功能有影响吗?
List<string> list = new List<string>() { "a", "b", "c", "d" };
string s = list.Find(e => {
list = new List<string>() { "1", "2", "3", "4" }; // <- this line shall happen in another thread
return e == "c";
});
我不知道内部结构,但是是否可以确定引用(在这种情况下为“列表”)在Find开始执行之前仅被读取一次?
答案 0 :(得分:1)
好吧,理论上,如果您对集合运行LINQ
查询,它将使用列表GetEnumerator
函数,该函数将返回知道如何枚举集合的枚举器对象,而不会使用包含对其引用的变量。
这就是为什么在此示例中:
List<string> list = new List<string>() { "a", "b", "c", "d" };
Task.Run(() =>
{
list.Find(e =>
{
Console.WriteLine($"El:{e} Hashcode:{list.GetHashCode()}");
Thread.Sleep(750);
return e == "z";
}).ToList();
});
Task.Run(() =>
{
Thread.Sleep(1000);
list = new List<string>();
});
Console.ReadKey();
输出为:
El:a Hashcode:63835064
El:b Hashcode:63835064
El:c Hashcode:11454272
El:d Hashcode:11454272