Разница между новым KeyEventHandler (Form1_KeyDown) и Form1_KeyDown - PullRequest
2 голосов
/ 27 апреля 2011

В приложении Windows Form вы можете зарегистрировать обработчики событий следующим образом:

          this.KeyDown += new KeyEventHandler(Form1_KeyDown);

и позже отмените регистрацию того же обработчика, как этот:

          this.KeyDown -= new KeyEventHandler(Form1_KeyDown);

Мне это кажется странным, потому что я ожидаю, что - = потребует того же обработчика, который был зарегистрирован изначально, а не второго нового обработчика с той же сигнатурой. Но из опыта я знаю, что это работает. Это привело меня к мысли, что это был особый случай и на самом деле

          Form1_KeyDown == new KeyEventHandler(Form1_KeyDown)

Исходя из этой теории, я часто переписывал свой код, чтобы регистрировать и отменять регистрацию таких событий:

          this.KeyDown += Form1_KeyDown;

Это безопасно? Или это будет иметь какой-то непреднамеренный побочный эффект, которого я не понимаю?

1 Ответ

4 голосов
/ 27 апреля 2011

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

Даже оператор с оператором new является синтаксическим сахаром, конструктор MulticastDelegate принимает два аргумента, а не один, как предлагает оператор, Target ( this ) и метод. Компилятор автоматически определяет цель. Важно понимать, что подписка на событие добавляет ссылку на ваш объект, это общий источник утечек.

Оператор + = также является синтаксическим сахаром, он переводится в вызов add метода доступа к событию. Аналогично, оператор - = переводится в вызов метода доступа remove . Много сантехники, которая намеренно скрыта.

И последнее, но не менее важное: вы делаете это неправильно. Вместо этого вы должны переопределить метод OnKeyDown () формы. Класс не имеет смысла слушать свои собственные события, они предназначены для другого, не связанного с ним кода. Это было немного не повезло.

...