Семантика оценки лямбд - PullRequest
0 голосов
/ 12 марта 2019

Допустим, у меня есть следующее:

class A 
{
  T x;
  Func<T> f;

  A() 
  {
    f = () => x;
  }

  void SetX(T blah)
  {
    x = blah;
  }
}

Всегда ли верно, что f() == x.

то есть после вызова SetX(y)правда, что f() == x == y?

(Обратите внимание, если это отличается для значений по сравнению с ссылочными типами)

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

1 Ответ

0 голосов
/ 12 марта 2019

Вместо «лямбда-аргументов» (у этой лямбды нет параметров) вы, вероятно, имеете в виду «переменные, захваченные лямбда-выражением», и вы спрашиваете, перехватываются ли переменные по значению (поэтому он запоминает значение во время создания лямбда) или по ссылке (таким образом, это относится к значению переменной во время запуска лямбды).

В этом случае x является переменной экземпляра, поэтому доступ к x неявно означает this.x, поэтому «локальная переменная», которую действительно захватывает лямбда, - это this (неявная this внутри конструктора). A). В C # замыкания захватывают переменные по ссылке (и это верно для всех типов переменных), но в этом случае, поскольку this не присваивается, не имеет значения, захватывается ли это по значению или по ссылке.

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