C # Обработка событий - PullRequest
2 голосов
/ 23 марта 2011

Когда я имею дело с настроенными событиями, я обычно пишу так:

data.event += new data.returndataeventhandler(method);

И у меня есть такой метод:

void method(parameter)
{
   dosomething();
}

Это когда событие возвращает объект.

Я только что прочитал чей-то другой код, и он использовал, как кажется, более чистый способ:

data.ReturnData += delegate(DataSet returnedDataSet)
                                    {
                                        dataset = returnedDataSet;
                                    };

Есть ли какой-либо недостаток в этом способе?

Спасибо.

Ответы [ 8 ]

2 голосов
/ 23 марта 2011

Одним из основных недостатков использования анонимных делегатов (или даже более чистой лямбды, как предлагает tster) является то, что вы не сможете отменить подписку на событие позже, если не дадите ему какое-то имя.

В большинстве случаев это «Не большое дело (tm)», потому что делегат уходит всякий раз, когда источник события исчезает, но это может быть «Незаметная ошибка (tm)», если вы подписываетесь настатические события или события на долгоживущих объектах (например, объект WPF Dispatcher).

В вашем случае это совсем не выглядит проблемой, поэтому я определенно рекомендую следовать рекомендации tster (при условии, что вы используете соответствующую последнюю версию .Net):

data.ReturnData += returnedDataSet => dataset = returnedDataSet;

(компилятор может определить тип returnedDataSet из типа EventHandler ReturnData.)

1 голос
/ 23 марта 2011

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

1 голос
/ 23 марта 2011

Как говорят другие, самое очевидное - это не многоразовое использование. Другие баллы:

  • удобочитаемость, особенно если у вас большой метод тела
  • потому что .NET генерирует случайное имя для анонимного метода (не очень значимого или читабельного), если вы используете технологию отражения типа или профилировщик, это может усложнить отслеживание.
1 голос
/ 23 марта 2011

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

0 голосов
/ 23 марта 2011

Помимо других ответов reusablity / Intellisense, я считаю, что единственным недостатком является то, что вам нужно удалить обработчик позже. С делегатом / lamba вы не можете легко удалить свой обработчик, если он больше не нуждается в вызове.

0 голосов
/ 23 марта 2011

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

0 голосов
/ 23 марта 2011

Даже чище:

data.ReturnData += returnedDataSet => dataset = returnedDataSet;
0 голосов
/ 23 марта 2011

Единственным недостатком является то, что если у вас есть более одного события, проще указать его на метод. Если бы вам приходилось прикреплять события в разных блоках к одному и тому же обработчику, вам пришлось бы где-то хранить свой делегат, чтобы оба блока могли его «увидеть».

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