Разница между новым KeyEventHandler(Form1_KeyDown) и Form1_KeyDown

В приложении 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам