Предупреждение! Принятый ответ от Стивена неверен, все, что он делает, это просто маскирует проблему, о которой resharper предупреждает о.
Каждый раз, когда данный код выполняется
EventHandler func = (sender, e) =>
listView_PreviewTextInput(sender, e, listView);
вы получите свежий (поскольку вы можете захватывать разные listView
) экземпляр анонимного делегата, сохраненный в func
, экземпляр, который еще не подписан на какие-либо события, поэтому, в свою очередь, этот код
listView.PreviewTextInput -= func;
фактически ничего не будет делать, так как вы не можете отказаться от подписки на событие, на которое не подписаны. Это приведет к ошеломляющим ошибкам, таким как «дважды вызываемые» обработчики событий, утечки памяти и т. Д.
На самом деле, Джон Скит говорит, что может работать в некоторых случаях:
В спецификации C # явно указано (IIRC), что если у вас есть две анонимные функции (анонимные методы или лямбда-выражения), она может или не может создавать равные делегаты из этого кода.
например когда компилятор не генерирует каждый раз новый экземпляр, вы увидите приятное поведение.
Но это ненадежно и, конечно, не сработает в случае, описанном в начальном вопросе с захваченной переменной listView
.
Итак, мое предложение:
Используйте анонимные функции в качестве обработчиков событий ТОЛЬКО в том случае, если вам никогда не придется отказываться от подписки.
person
Shorstok
schedule
17.12.2016