Использование типов делегатов против методов - PullRequest
3 голосов
/ 12 июня 2010

Я вижу все большее использование типов делегатов, предлагаемых в пространстве имен System (Action<T>; Predicate<T> и т. Д.).Поскольку это делегаты, я понимаю, что их следует использовать там, где мы традиционно использовали делегатов в прошлом (асинхронные вызовы; запуск потоков, обработка событий и т. Д.).Является ли это просто предпочтением или считается практикой использовать эти типы делегатов в сценариях, таких как ниже;вместо того чтобы использовать вызовы методов, которые мы объявили (или анонимные методы):

public void MyMethod()
{
      Action<string> action = delegate(string userName
      {
            try
            {
               XmlDocument profile = DataHelper.GetProfile(userName);
               UpdateMember(profile);
            }
            catch (Exception exception)
            {
               if (_log.IsErrorEnabled) _log.ErrorFormat(exception.Message);
               throw (exception);
            }
      };

      GetUsers().ForEach(action);
}

Сначала я обнаружил, что код менее интуитивно понятен, чем использование объявленных или анонимных методов.Я начинаю кодировать таким образом, и мне интересно, что вы думаете об этом.В приведенном выше примере все внутри метода.Это злоупотребление делегатом?

1 Ответ

4 голосов
/ 12 июня 2010

Для простого цикла foreach я бы предпочел нормальную языковую конструкцию - см. это сообщение в блоге для представления Эрика Липперта .Я думаю, что использование делегата здесь несколько бесполезно.

В других случаях - особенно с LINQ - это имеет большой смысл.

Делегаты - хороший способ разрешить специализацию без дополнительных затратобъявления и реализации интерфейса или наследования от типа для переопределения методов ... но все в модерации, конечно.Если у вас есть несколько методов для реализации (и вы действительно хотите указать поведение для всех них), тогда интерфейс имеет больше смысла.Если вы действительно создаете специализированный тип , тогда вывод и переопределение имеют смысл.Однако если вам нужен шаблон стратегии, тогда делегаты работают очень аккуратно.

...