Навіщо потрібні делегати в c #

Отже як це робиться в C #? Наприклад ви пишете калькулятор і у вас є найпростіша логіка:

Це просте і витончене рішення має право на життя, але у нього є деякі проблеми:

  • Софт мінливий. Завтра вам знадобиться додати взяття по модулю і тоді доведеться перекомпілювати клас. На певних стадіях проекту це недешеве задоволення для споживачів вашого класу.
  • Код в поточному вигляді не має ніяких перевірок вхідних даних. Якщо їх додати, то switch непристойно розростеться.

Ма лаасот. як кажуть мої ізраїльські друзі.

По-перше треба инкапсулировать код в функції:

По друге треба взагалі позбутися світча:

Що ми зробили? Ми винесли ухвалу операцій з коду в дані - з світча в словник.

Делегат це об'єкт який вказує на функцію. Викликаючи делегат, ми викликаємо функцію на яку він вказує. В даному випадку ми створюємо делегат на функцію приймаючу два double параметра і в усьому зростали double. У другому рядку ми створюємо маппинг між символом операції (+ - * /) і її функцією.
Таким чином ми дозволили перший недолік: список операцій можна змінювати на свій розсуд.

На жаль ми поимели зайвий делегат, та й запис виду

не так зрозуміла як

Починаючи з C # 2.0 ми можемо розрулити цю проблему впровадженням анонімних методів:

Тут для додавання і віднімання я використовую анонімні методи, а для множення і ділення повноцінні методи. Але все одно дуже багато води.

На допомогу приходить C # 4.0 з лямбда:

Сигнатура фанку читається як Func<тип первого аргумента, тип второго аргумента, тип результата>. Сам по собі Func це той же делегат, але з генериками. Крім зручності записи, Func приймає як лямбда, так і анонімні методи, так і звичайні методи і все під одним написання ключових слів. Хіба це не дивно зручно?

Таким чином в C # можна писати витончені, типізовані конструкції практично без зайвої води.

Нафіга питається всякі фанки-шманкі?

Відповідаю: C # це строго-типізований мову, який строго стежить за тим щоб типи збігалися і не падали в Рантайм. За спробу присвоєння неправильних типів, він б'є по руках при компіляції. Тому йому потрібно формальне вказівку про всіх фігурують типах.

Схожі статті