Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_ПАРАДИГМИ ПРОГРАМУВАННЯ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.32 Mб
Скачать

Лекція 11. Елементи функціонального програмування в c#

План

1. Елементи функціонального програмування в C#

2. Делегати

3. Лямбда-вирази і лямбда-функції

11.1. Елементи функціонального програмування в c#

Навіть з назви «Функціональне програмування» ясно, що основний наголос в ньому робиться на функції (у математичному сенсі), тобто, y=f(x). Функціональне обчислення – функція (або якщо бути точніше – «чиста функція», pure function) – повинна приймати деякі аргументи (вхідні дані) на вході, виконувати обчислення і повертати деякий результат. При цьому функція не повинна створювати жодних побічних ефектів. Під побічними ефектами розуміється можливість функції:

  1. Змінювати глобальні (статичні в термінах C#) змінні.

  2. Викликати інші функції, які можуть створити побічний ефект.

  3. Займатися будь-яким введенням/виведенням усередині функції.

  4. Посилати або приймати деякі повідомлення.

По суті, пункти 2-4 є різновидами одного і того ж – зміна стану за допомогою виклику.

Таким чином, функція не має права робити нічого, що могло б змінити стан чого б то не було (наприклад, змінних в пам'яті). Все, що може робити функція – це виконувати обчислення і видавати результат.

Програмування у функціональному стилі дозволяє зробити код коротше і безпечніше.

C# не є повністю мовою функціонального програмування, але містить елементи, що дозволяють писати програми у функціональному стилі.

До основних елементів функціонального програмування, підтримуваних в C#, можна віднести: делегати, лямбда-вирази і дерева виразів, а також нова інтегрована мова запитів Language Integrated Query (LINQ).

11.2. Делегати

Делегати в C# є аналогом посилання на функцію в C++. Сама по собі функція (метод) або її ім'я не є чимось, чим можна було б маніпулювати, але якщо помістити її делегат, з'явиться можливість посилатися на неї, а значить передавати в інші функції і повертати функції з інших функцій. Таким чином, можна сказати, що делегати є аналогами функціональних типів в мовах функціонального програмування.

Основне використання делегатів у C# - обробка подій.

Багато класів стандартної бібліотеки .Net Framework використовують делегати для повідомлення про події, що сталися в них. Відповідно, розробники середовища .NET визнали, що буде доцільно ввести загальний стандартний тип делегат, який використовуватиметься у всій бібліотеці. Його прототип представлений нижче.

public delegate void EventHandler(

// Посилання на об'єкт, що викликав подію.

object sender

// Параметри, що описують подію.

EventArgs e

);

Цей делегат приймає всього лише два параметри, що явно замало для універсального делегата. Але все таки виявляється, цих параметрів вистачає для передачі будь-якої інформації. Сам по собі клас EventArgs не містить жодного члена, здатного передавати яку б то не було інформацію. Він введений лише для узагальнення. Коли необхідно передати додаткову інформацію, вводиться новий клас, похідний від EventArgs, в якому вже і вводяться поля, які передають необхідну інформацію. У одній загальній бібліотеці у класу EventArgs 100 нащадків, і їх кількість від версії до версії середовища виконання неухильно зростає.

При зверненні до події, що має тип даного делегата, як параметр необхідно передати посилання на поточний об'єкт (this), а в другому параметрі екземпляр класу EventArgs або похідного від нього.

SomeEvent(this, EventArgs.Empty);

де властивість Empty просто повертає порожній екземпляр типу EventArgs. В принципі, його можна створити і самому скориставшись оператором new.

SomeEvent(this, new EventArgs());

Приклад

Програма для генерації варіантів тестів. Використовуються стандартые делегати.

Одні і ті самі дії можна виконати при натисненні кнопки, вибором пункту меню або кнопки панелі інструментів. Наприклад, генерація варіантів (програмна кнопка).

private void btmGentest_Click(object sender, EventArgs e)

{

//кнопка Button – фрагмент коди

DateTime Date; //дата з календаря у форматі DateTime

//Знімаємо дані з полів форми

string Disc = txtDisc.Text; //Дисциплина

string Teacher = comboBox1.Text; //Преподаватель

try

{

if (Disc.Length == 0)

{

throw new Exception("Введіть назву дисципліни");

}

if (Teacher.Length == 0)

{

throw new Exception("Введіть прізвище викладача");

}

Date = monthCalendar1.SelectionRange.Start; //дата, вибрана на календарі. За умовчанням, поточна дата

string strDate = Date.ToString(); //преобразование дати в рядок

int numberVariant = (int)numericUpDown1.Value; //к-во варіантів завдань.

}

--------------------------- ----------------------------------

private void toolStripButton1_Click(object sender, EventArgs e)

{

//кнопка панелі інструментів Генерувати - делегат події btmGentest_Click

btmGentest_Click(this, new EventArgs());

}

--------- ------------------- ------------------------------

private void генеруватиToolStripMenuItem1_Click(object sender, EventArgs e)

{

//меню Генеруваті

//кнопка генерації - делегат події btmGentest_Click

btmGentest_Click(this, new EventArgs());

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]