Обработчики событий, автоматически создаваемые WinForms Designer - PullRequest
2 голосов
/ 18 июня 2010

Я только что перешел из VB.NET в C #. В VB для подключения обработчика событий к Sub мы используем предложение Handles .

Судя по всему, этого нет в C #.

После создания простого приложения с кнопкой я понимаю, что Window Forms Designer автоматически создал EventHandler для моей функции button1_Click (после того, как я дважды щелкнул по ней) в Form1.Designer.cs с этим кодом:

this.button1.Click += new System.EventHandler(this.button1_Click);

Но в VB WinForms Designer создает предложение Handles в моем классе в заголовке функции.

Итак, C # создает EventHandler по умолчанию в файле конструктора, а VB создает в основном классе, в котором находится элемент управления.

Это правильно? Я что-то здесь упускаю?

Ответы [ 6 ]

7 голосов
/ 18 июня 2010

Вы правы в том, что в C # нет аналога предложения VB.NET handles (или соответствующего декоратора переменных WithEvents).Они существуют только в VB.NET как удерживающие устройства от классического VB, и у них есть накладные расходы при их использовании (сгенерированный IL фактически должен отслеживать везде, где установлена ​​переменная, чтобы отсоединить и присоединить все функции, которые handles это событие).

Если вы проверите IL для формы или элемента управления VB.NET, вы фактически обнаружите, что существует свойство, созданное для каждой WithEvents переменной и метода установкизаботится об удалении всех фактических обработчиков из старого значения (при условии, что оно не равно нулю) и присоединении их к новому значению (при условии, что оно не равно нулю).

Аналог для обработки событий в C # в VB.NET - это оператор AddHandler.

1 голос
/ 18 июня 2010

Это абсолютно правильное поведение, и вы ничего не упускаете.

В VB вы можете подписаться на событие, используя ключевое слово Handles или операторы AddHandler и AddressOf. Visual Studio использует ключевое слово Handles для событий, созданных дизайнером. Поскольку обработчики событий должны находиться в файле кода, а не в файле конструктора, их можно увидеть при редактировании кода файла. Если бы Visual Studio использовала AddHandler, она вставила бы этот код в метод InitializeComponent в файле кода конструктора.

С другой стороны, в C # есть один оператор (+=) только для подписки на события. Таким образом, этот код входит в файл конструктора, а не в файл кода, чтобы избежать смешивания кода, сгенерированного дизайнером, с кодом пользователя.

Надеюсь, это поможет!

1 голос
/ 18 июня 2010

Ключевое слово VB Handles - это просто синтаксический сахар, который делает то же самое, что и в C #. Вы могли бы написать VB таким же образом, но почему бы вам?

Метод C # (который можно эмулировать в VB) действительно обеспечивает большую гибкость (т. Е. Вызывает один и тот же метод для двух разных элементов управления).

0 голосов
/ 18 июня 2010

Все, что модифицировано в Form1.cs [Design], будет иметь часть кода в Form1.Deisgner.cs Именно так C # .NET знает, как заставить вещи появляться.

Он должен был также создать в вашем Form1.cs некоторый код, где вы на самом деле заполните то, что будет в событии.

0 голосов
/ 18 июня 2010

Рассмотрим += как AddHandler с AddressOf

0 голосов
/ 18 июня 2010

Да, это правильно, дизайнер создает его в сгенерированном файле * .designer.cs.Конечно, вы можете создавать обработчики событий вручную с тем же синтаксисом.Такое поведение достигается функцией частичного класса, где вы можете определять части класса в разных файлах.

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