Lambda inside Lambda

本文关键字:Lambda inside | 更新日期: 2023-09-27 18:08:08

假设我们有一个类似的lambda表达式

        var thread= new Thread(() =>
        {
            Foo1();
            Foo2(() =>
            {
                Foo3();
                DoSomething();
            }
            );
        });

问题是CCD_ 1何时评估?在创建thread时还是在调用thread.Start()时?

Lambda inside Lambda

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

  1. 将创建委托并将其传递给Thread构造函数。委托中的任何代码都不会执行
  2. 大概有人打电话给thread.Start()
  3. Foo1()执行
  4. 创建了一个代表对Foo3()DoSomething()0的调用的委托(或可能从缓存字段中检索(,但这些调用尚未执行
  5. 委托引用传递给Foo2()
  6. 如果Foo2()执行委托,则将执行Foo3()DoSomething()

委托可以从不调用或多次调用。Foo2((可以对委托执行任何它想要的操作,包括将它分配给某个变量或完全忽略它。

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