Повторяется ли лямбда-код с динамически созданными элементами управления?

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

Пропустив .Net 2-4 и только сейчас изучив «новые» вещи, на самом деле это и привело меня к вопросу в первую очередь..:

private void AddPieceButton_Click(object sender, EventArgs e)
{
   somePieceControl newPiece = new somePieceControl ();
   //..
   newPiece.MouseDown += (sender2, evt) =>  { /* 1st block of code */ };
   newPiece.MouseUp   += (sender2, evt) =>  { /* 2nd block of code */ };
   newPiece.MouseMove += (sender2, evt) =>  { /* 3rd block of code */ }
   //..
   someContainer.Controls.Add(newPiece);
}

В тестовом случае вопрос едва ли имеет значение; но блоки кода могут легко стать намного больше и намного больше; также в такой игре, как Го, в конечном итоге будут сотни игровых элементов.

В то время как кто-то может / мог бы и должен подвергнуть сомнению идею добавления такого количества элементов управления, пытливые умы все еще хотят знать..: Будет ли каждая часть иметь свою собственную копию этих блоков кода, как я полагаю, или они учтены в нашем мире чудес? как обычные события и живут только один раз в оперативной памяти?


person TaW    schedule 31.08.2014    source источник


Ответы (2)


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

person Michael Liu    schedule 31.08.2014

Как сказал Майкл Лю, использование лямбда-выражений не требует дополнительной памяти. Но вам нужно знать о замыканиях, которые хранят ссылки на нелокальные переменные (я имею в виду, во внешней области видимости лямбды). Вы даже можете получить утечку памяти при использовании замыканий.

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

person Eldar Dordzhiev    schedule 31.08.2014
comment
Спасибо за эти подсказки. Я обязательно посмотрю на замыкания. Как обстоят дела с примерами, где все лямбды — это просто стандартные события. Возможна ли проблема? Что касается маршрутизации событий: я считаю, что OP был в Winforms. - person TaW; 31.08.2014
comment
Извините, не видел Controls.Add() :) Если эти лямбда-выражения не используют переменные внешней области видимости, такие как newPiece, проблем не будет. - person Eldar Dordzhiev; 31.08.2014