Лямбда внутри Лямбда - PullRequest
       12

Лямбда внутри Лямбда

4 голосов
/ 11 сентября 2011

предположим, что у нас есть лямбда-выражение типа

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

вопрос в том, когда DoSomething() вычисляется?thread создание или вызов thread.Start()?

Ответы [ 2 ]

8 голосов
/ 11 сентября 2011

DoSomething() может никогда не вызываться .Он будет вызываться только в том случае, если Foo2() выполняет делегированный ему делегат.Таким образом, порядок выполнения:

  1. Делегат создан и передан конструктору Thread.Ни один из кодов в делегате не выполняется.
  2. Предположительно, кто-то вызывает thread.Start().
  3. Foo1() выполняет
  4. Делегат создан (или, возможно, получен из кэшированногополе), представляющее вызовы Foo3() и DoSomething(), но эти вызовы еще не выполнены
  5. Ссылка на делегат передается в Foo2()
  6. Если Foo2() выполняет делегат,, затем Foo3() и DoSomething() будут выполнены
0 голосов
/ 19 сентября 2011

Делегат может быть вызван никогда или несколько раз.Foo2 () может делать с делегатом все, что захочет, в том числе назначать его переменной или игнорировать вообще.

Мы только знаем, что при запуске это должно произойти в какой-то момент после запуска потока и выполнения Foo1 () без выдачи необработанного исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...