Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda内Lambda_C#_.net 4.0_Lambda - Fatal编程技术网

C# Lambda内Lambda

C# Lambda内Lambda,c#,.net-4.0,lambda,C#,.net 4.0,Lambda,假设我们有一个lambda表达式,如 var thread= new Thread(() => { Foo1(); Foo2(() => { Foo3(); DoSomething(); } ); }); 问题是何时评估DoSomething()?在th

假设我们有一个lambda表达式,如

        var thread= new Thread(() =>
        {
            Foo1();
            Foo2(() =>
            {
                Foo3();
                DoSomething();
            }
            );
        });
问题是何时评估
DoSomething()
?在
thread
创建或调用
thread.Start()

DoSomething()
时可能永远不会被调用。只有当
Foo2()
执行所给的委托时,才会调用它。因此,执行的顺序是:

  • 委托被创建并传递给
    线程
    构造函数。委托中的所有代码均未执行
  • 大概有人调用了
    thread.Start()
  • Foo1()
    执行
  • 将创建一个委托(或可能从缓存字段中检索),表示对
    Foo3()
    DoSomething()
    的调用,但这些调用尚未执行
  • 委托引用被传递到
    Foo2()
  • 如果
    Foo2()
    执行委托,则将执行
    Foo3()
    DoSomething()

  • 可以从不调用该委托,也可以多次调用该委托。Foo2()可以对委托执行任何操作,包括将其指定给某个变量或完全忽略它

    我们只知道如果run,它必须在线程启动且Foo1()执行后的某个时间点发生,而不会引发未捕获的异常。

    当然,Foo2()也可以将委托分配给一个变量,而另一个函数(可能在另一个线程上,甚至在原始线程上)可能会执行它,可能多次。它是一个