Как лямбда-выражения работают внутри компании?

StackOverflow https://stackoverflow.com/questions/1638459

  •  08-07-2019
  •  | 
  •  

Вопрос

Пока ищу ответ на этот вопрос:"Почему параметр out не разрешен в анонимном методе?" Я немного запутался в том, как на самом деле работают лямбда-выражение и анонимные методы.

В комментариях JaredPar говорится, что "Представьте, например, что параметр out ссылается на локальную переменную в стеке.Лямбда-код может выполняться в любой произвольный момент в будущем и, следовательно, может выполняться, когда этот кадр стека больше не будет действительным ".

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

То, что я имею в виду, это что-то вроде этого:

public void Foo(ComplexObject val, out SomeDelegate outDelegate)
{
  ComplexObject obj = new ComplexObject(val)
  SomeDelegate = delegate(int other) { return (obj.value * other); }  
}

public void Bar()
{
  SomeDelegate MyDel = null;
  Foo(5, out MyDel);
  int finalRes = MyDel(100);
  // Whatever
}

В такой ситуации я действительно не понимаю, что происходит.obj - это ссылка в стеке, которая больше не будет действительной при возврате метода, поэтому анонимный метод должен иметь возможность (если это работает) фактически знать, что это ссылочный тип, и копировать ссылку вместо значения, если это так...почему параметры ref не будут работать, если "вариант использования" более или менее одинаков?

Это было полезно?

Решение

Я написал довольно обширную серию блогов о том, как закрытия работают внутри компании.Он написан для VB.Чистая реализация замыканий, но базовые детали очень похожи на C #.Это должно дать ответы, которые вы ищете

Вот ссылка на часть 6, которая ссылается на все другие статьи

Другие советы

Джон Скит написал подробное описание .

По сути, компилятор превращает внешний метод в класс и превращает все переменные, к которым обращаются анонимные методы, в поля класса. Анонимные методы становятся обычными методами экземпляра в классе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top