Где захваченные переменные размещены во вложенной функции в C # - PullRequest
0 голосов
/ 29 апреля 2018

Упомянутая вложенная функция означает, что это может быть как лямбда-функция, так и локальная функция.

Мне любопытно, где расположены захваченные переменные.

Например:

private Func<int> Test(int arg)
{
    var x = arg;
    return () => x;
}

Локальная переменная x захватывается возвращаемой лямбда-функцией.

Тогда где же это x расположено в памяти? Это в стеке или куче памяти?

Если это x в стеке, любой дальнейший вызов Test может изменить значение x, и поведение возвращаемой лямбда-функции может быть неправильно изменено.

Но если будет динамически размещаться в динамической памяти, он больше не будет похож на локальную переменную.

Было ли оно сначала размещено в стеке и передано в кучу сразу после возврата Test? (Я думаю, не потому, что это звучит как излишняя стоимость некоторых ресурсов, но как это работает, чтобы сделать его доступным для доступа к x после возврата Test?)

1 Ответ

0 голосов
/ 29 апреля 2018

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

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

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