Анонимные делегаты предназначены для того, чтобы помочь вам сделать код более читабельным благодаря возможности определения поведения простого делегата, встроенного в другой метод. Это означает, что если вы имеете дело с чем-то, что требует делегата (например, обработчик события), вы можете определить поведение прямо в коде, а не создавать для него специальную функцию.
Кроме того, они являются предшественниками лямбда-выражений. Такие вещи, как LINQ to Objects (любой из методов, работающих с IEnumerable<T>
), используют делегаты для выполнения запросов к объектам. Например, если у вас есть коллекция строк и вы хотите запрос, который находит все из них длиной пять символов, вы можете сделать это с помощью лямбды:
List<string> strings = ...
var query = strings.Where(s => s.Length == 5);
Или вы можете сделать это с анонимным делегатом:
var query = strings.Where(delegate(string s) { return s.Length == 5; });
Если у вас их нет, ваш код будет выглядеть примерно так:
var query = strings.Where(IsFiveCharacters);
...
private bool IsFiveCharacters(string input)
{
return input.Length == 5;
}
Важно понимать, что лямбда-выражения и анонимные делегаты - это просто функции компилятора. Когда ваш код скомпилирован, он действительно создает обычные функции, как в предыдущем примере, но они скрыты и имеют имена, которые являются недопустимыми в используемом языке. Есть много логики, которая обходит их при выполнении таких вещей, как замыкания (когда вы обращаетесь к переменной, которая существует вне лямбда / анонимного объявления делегата), а также.