Отже як це робиться в C #? Наприклад ви пишете калькулятор і у вас є найпростіша логіка:
Це просте і витончене рішення має право на життя, але у нього є деякі проблеми:
- Софт мінливий. Завтра вам знадобиться додати взяття по модулю і тоді доведеться перекомпілювати клас. На певних стадіях проекту це недешеве задоволення для споживачів вашого класу.
- Код в поточному вигляді не має ніяких перевірок вхідних даних. Якщо їх додати, то switch непристойно розростеться.
Ма лаасот. як кажуть мої ізраїльські друзі.
По-перше треба инкапсулировать код в функції:
По друге треба взагалі позбутися світча:
Що ми зробили? Ми винесли ухвалу операцій з коду в дані - з світча в словник.
Делегат це об'єкт який вказує на функцію. Викликаючи делегат, ми викликаємо функцію на яку він вказує. В даному випадку ми створюємо делегат на функцію приймаючу два double параметра і в усьому зростали double. У другому рядку ми створюємо маппинг між символом операції (+ - * /) і її функцією.
Таким чином ми дозволили перший недолік: список операцій можна змінювати на свій розсуд.
На жаль ми поимели зайвий делегат, та й запис виду
не так зрозуміла як
Починаючи з C # 2.0 ми можемо розрулити цю проблему впровадженням анонімних методів:
Тут для додавання і віднімання я використовую анонімні методи, а для множення і ділення повноцінні методи. Але все одно дуже багато води.
На допомогу приходить C # 4.0 з лямбда:
Сигнатура фанку читається як Func<тип первого аргумента, тип второго аргумента, тип результата>. Сам по собі Func це той же делегат, але з генериками. Крім зручності записи, Func приймає як лямбда, так і анонімні методи, так і звичайні методи і все під одним написання ключових слів. Хіба це не дивно зручно?
Таким чином в C # можна писати витончені, типізовані конструкції практично без зайвої води.
Нафіга питається всякі фанки-шманкі?
Відповідаю: C # це строго-типізований мову, який строго стежить за тим щоб типи збігалися і не падали в Рантайм. За спробу присвоєння неправильних типів, він б'є по руках при компіляції. Тому йому потрібно формальне вказівку про всіх фігурують типах.