Механизм делегатов в .NET - очень обширная тема и существует множество способов его применения, от элементарных до, например реализации поставщика данных IQueryable - http://msdn.microsoft.com/ru-ru/library/bb546158.aspx. Пока до этого не дошел, так как материал не самый лёгкий для восприятия, ограничиваюсь более простыми конструкциями:)
Итак. К примеру, есть задача написать нечто, подобное калькулятору для консольного приложения. Как правило программа ожидает такой пользовательский ввод: первое число, операция, второе число. Многие не заморачиваясь, пишут нечто подобное:
-
switch (operation)
-
{
-
case "+": Console.WriteLine("{0}", x + y); break;
-
case "-": Console.WriteLine("{0}", x - y); break;
-
case "*": Console.WriteLine("{0}", x * y); break;
-
case "/": Console.WriteLine("{0}", x / y); break;
-
default:
-
throw new Exception(String.Format(
-
"Непонятная операция: {0}", operation));
-
}
Но, как видно, такая конструкция не совсем хороша.
Гораздо более интереснее выглядит такой код:
-
private static readonly Dictionary<string, Func<decimal, decimal, decimal>> Operations =
-
new Dictionary<string, Func<decimal, decimal, decimal>>();
-
static void Main(string[] args)
-
{
-
Operations["+"] = (x, y) => x + y;
-
Operations["-"] = (x, y) => x - y;
-
Operations["*"] = (x, y) => x * y;
-
Operations["/"] = (x, y) => x / y;
-
foreach (var func in Operations)
-
func.Value(321, 123).Print();
-
Console.ReadLine();
-
}
Здесь мы объявили словарь, где ключом является некая операция, а значением - сопоставленное ключу лямбда-выражение. Расширение Print объявлено следующим образом:
-
public static void Print<T>(this T value)
-
{
-
Console.WriteLine(value);
-
}
Как вариант использования:
-
Operations["+"](123,123).Print();
На этом пока все, дальше буду писать более интересные вещи, такие как использование предикатов и написание расширений методов Linq.
И кстати, кто-нибудь изучает или применяет F# в повседневной жизни?