Допустим, что тебе надо отсортировать массив строк в соответствии с каким-то очень специальным правилом сравнения. В .NET 1.x правило надо записать в виде метода некоторого класса, дать ему имя, и только после этого использовать. Метод надо создавать, даже если он используется только в одном месте.
private int specialStringCompare(string s1, string s2) { /* как-то сравнить строки */ }
public void f(string[] strings)
{
// бла-бла
sort(strings, new CompareDelegate(specialStringCompare));
// бла-бла
}
Некоторые люди считают, что одноразовые функции надо описывать непостредственно в точке использования. Обоснования могут быть самые разные, например, чтобы не замусоривать объявление класса лишними сущностями.
Используя анонимные методы, можно уменьшить число объявлений в классе:
public void f(string[] strings)
{
// бла-бла
sort(strings, delegate int (string s1, string s2) { /* как-то сравнить строки */ } );
// бла-бла
}
Это может быть удобным для быстрой разработки, когда надо быстренько склепать код.