相关疑难解决方法(0)

foreach标识符和闭包

在以下两个片段中,第一个是安全的还是你必须做第二个?

安全我的意思是每个线程保证从创建线程的相同循环迭代中调用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的回答所指出的,这与线程没有任何关系.

c# closures enumeration

78
推荐指数
3
解决办法
1万
查看次数

有人能用简单的术语解释C#中的"访问修改后的闭包"吗?

可能重复:
什么是'关闭'?
访问修改后的闭包
访问修改后的闭包(2)

Resharper抱怨下面这段代码:

foreach (string data in _dataList)
    DoStuff (() => field);
Run Code Online (Sandbox Code Playgroud)

什么是关闭?我为什么要关心?

我已经读过关于数学和函数式编程的闭包,我在这里不知所措.我的大脑太沉重了.

简单来说,这里发生了什么?

c# closures

8
推荐指数
1
解决办法
6774
查看次数

foreach和list.ForEach()之间的闭包有何不同?

考虑这段代码.

        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

c# foreach closures c#-4.0

5
推荐指数
2
解决办法
635
查看次数

标签 统计

c# ×3

closures ×3

c#-4.0 ×1

enumeration ×1

foreach ×1