Скажите, что у вас есть кнопка в вашей форме. Вы приложенный анонимную функцию Click
события баттона:Анонимные функции и локальные переменные
void Test()
{
int x = 10;
btn.Click += (sender, e) => { MessageBox.Show(x.ToString()); };
}
Это работает, как ожидалось, и отображает 10; означает, что он может обращаться к локальным переменным. Мой вопрос: как и почему? Как анонимная функция получает доступ к локальному контексту?
Фактическая проблема, с которой я имею дело, заключается в том, что мне нужно обновить (так сказать) эту анонимную функцию до обычной функции (обработчика событий). Но это означает, что я потеряю доступ к переменной x. Я не могу передать его как параметр, потому что тогда я не смогу подключить его к событию Click
(несоответствие подписи). Я могу обойти это, создав глобальные переменные и все такое, но как анонимные функции позволяют получить доступ к вещам, выходящим за рамки их возможностей?
Возможный дубликат http: // stackoverflow.com/q/742365/3970411 – dotctor
* Зачем вам нужно создать регулярную функцию для этого? Если бы вы могли дать больше контекста, это действительно помогло бы. Например, достаточно ли просто получить делегата? Потому что вы можете сделать это достаточно легко: «EventHandler handler = (sender, e) => {...}' –
@JonSkeet: часть более крупной проблемы, когда мое присоединенное свойство не вызывает 'PropertyChangedCallback', которое я объявил и назначенный анонимно. Я подозреваю, что это может быть связано с тем, что анонимный метод выходит из сферы действия и, таким образом, вытирается GC и поэтому хочет попробовать с обычной функцией. – dotNET