在以下两个片段中,第一个是安全的还是你必须做第二个?
安全我的意思是每个线程保证从创建线程的相同循环迭代中调用Foo上的方法?
或者你必须将引用复制到一个新的变量"local"到循环的每次迭代?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
更新:正如Jon Skeet的回答所指出的,这与线程没有任何关系.
可能重复:
什么是'关闭'?
访问修改后的闭包
访问修改后的闭包(2)
Resharper抱怨下面这段代码:
foreach (string data in _dataList)
DoStuff (() => field);
Run Code Online (Sandbox Code Playgroud)
什么是关闭?我为什么要关心?
我已经读过关于数学和函数式编程的闭包,我在这里不知所措.我的大脑太沉重了.
简单来说,这里发生了什么?
考虑这段代码.
var values = new List<int> {123, 432, 768};
var funcs = new List<Func<int>>();
values.ForEach(v=>funcs.Add(()=>v));
funcs.ForEach(f=>Console.WriteLine(f()));//prints 123,432,768
funcs.Clear();
foreach (var v1 in values)
{
funcs.Add(()=>v1);
}
foreach (var func in funcs)
{
Console.WriteLine(func()); //prints 768,768,768
}
Run Code Online (Sandbox Code Playgroud)
我知道由于lambda捕获的闭包变量,第二个foreach打印768次3次.为什么在第一种情况下不会发生?foreach关键字如何与方法不同Foreach?当我这样做时,表达式是否被评估?values.ForEach