Определение делегата C# — анонимные методы против формально определенных методов

Когда следует использовать анонимные методы при определении делегата и когда следует использовать формально определенные методы при определении делегата?


person Scott Davies    schedule 12.07.2009    source источник


Ответы (2)


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

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

Кроме того, анонимная функция может быть полезна, даже если она достаточно длинная, если она используется для чего-то вроде распараллеливания с помощью Parallel Extensions — часть этого заключается в том, что вы можете взять существующий последовательный код и в значительной степени распараллелить его «на месте».

Вы также можете рассмотреть возможность тестирования — если код вашего делегата достаточно сложен, чтобы он требовал собственных модульных тестов, представление его как метода имеет большой смысл. (К сожалению, это должен быть либо внутренний метод, использующий InternalsVisibleTo, либо общедоступный метод, хотя часто вы хотели бы, чтобы он был закрытым, но такова жизнь.)

person Jon Skeet    schedule 12.07.2009
comment
Разделение логики было чем-то, что я не рассматривал, и простота доступа к локальным переменным без передачи параметров интересна. Являются ли параллельные расширения функцией C# 4.0? - person Scott Davies; 12.07.2009
comment
Я хотел бы добавить, что они не исключают друг друга. Часто удобно иметь анонимную функцию, которая в основном вызывает обычную функцию, чтобы одновременно получить преимущества повторного использования и закрытия. - person Steven Sudit; 12.07.2009
comment
Да, параллельные расширения поставляются с версией 4.0. - person Steven Sudit; 12.07.2009
comment
Спасибо, Стивен. Вы работали с бета-версией VS 2010? Вы бы порекомендовали мне начать оценивать его сейчас? Насколько мне известно, он запланирован на 4-й квартал РТМ этого года. - person Scott Davies; 12.07.2009
comment
Обратите внимание, что Parallel Extensions — это функция .NET 4.0, а не C# 4.0. Мне всегда нравится отделять языковые версии от версий платформы. Между прочим, я не видел никаких дат RTM для VS2010, и четвертый квартал звучит для меня довольно оптимистично. Я подозреваю, что это действительно будет в 2010 году. Опять же, это отчасти просто надежда на то, что второе издание моей книги не выйдет намного позже, чем продукт :) - person Jon Skeet; 12.07.2009
comment
Я считаю, что возможность захвата локальных переменных в замыкании очень удобна. Что касается VS 2010, то пока он неплох. Я использую его для программирования на C# 3.0 и C++ уже около месяца. Есть несколько проблем со стабильностью, и для многих людей набор текста может показаться медленным и вялым (отмечено в блоге Рико Мариани блоги). .msdn.com/ricom). Если бы я использовал его для какой-либо серьезной разработки, я бы, вероятно, подождал до бета-версии 2, когда будут решены еще несколько проблем. - person smaclell; 12.07.2009
comment
@smalcell - Спасибо за ваш вклад, особенно в отношении стабильности. Я продолжу это на виртуальной машине, что снизит производительность, но изолирует мою основную среду разработки. @Jon Skeet - Слишком круто! Я купил первое издание вашей книги, и оно стоит в очереди на прочтение. Книги Мэннинга прекрасны! Есть ли во втором издании какие-либо обновления для C# 3.0? Я буду MEAP, если это так. - person Scott Davies; 12.07.2009
comment
@Scott: Да, будут некоторые обновления существующего текста (хотя я еще не начал их делать) - хотя большинство изменений будут новыми главами для C# 4. - person Jon Skeet; 13.07.2009
comment
@Scott: мне нечего добавить к исчерпывающим и правильным ответам Джона, кроме общего одобрения архитектуры Parallel Extensions. Это определенно шаг в правильном направлении, и он может существенно повлиять на производительность вашего приложения. - person Steven Sudit; 13.07.2009

Я использую анонимные методы, когда функция, которая должна выполняться, должна выполняться только этим делегатом (другими словами: когда мне не нужна эта функция в каком-либо другом месте), и когда функция/метод, который должен быть выполнен, относительно короткий (максимум 5 строк).

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

person Frederik Gheysels    schedule 12.07.2009
comment
Ах, это имеет смысл: относительно короткая длина. Спасибо и за мнение о читабельности, так как я нашел анонимный синтаксис немного более сложным, и я подумал, что это только я! - person Scott Davies; 12.07.2009