Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c#_theoretical_2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
750.08 Кб
Скачать

Тема 3 Делегати та події Клас delegate

При виконанні програми машинний код відкомпільованої функції завантажується в оперативну пам’ять комп’ютера. Адресу, за якою функція буде розташована в пам’яті, можна використовувати для її виклику. Для цього у мові С# існує спеціальний тип даних – делегат, значенням якого є адреса функції.

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

Синтаксис оголошення делегату має такий вигляд:

[атрибути][модифікатор] delegate тип_результату ім’я_класу (список_формальних_параметрів);

У якості модифікаторів для делегату можуть бути використаними тільки new, public, protected, internal та private.

Покажемо на прикладі способи роботи з делегатами. У класі Math є статичні методи, що обчислюють значення наступних основних елементарних математичних функцій:

double Sin(double a); // y = sin(x)

double Exp(double a); // y = exp(x)

double Atan(double a); // y = arctg(x)

// і т.д.

Опишемо делегат із іменем ElementaryFunction, який визначає новий тип даних, що вказує на будь-який метод, що повертає значення типу double та яка приймає один аргумент типу double.

delegate double ElementaryFunction(double x);

Тепер можна створювати та ініціалізувати об’єкти-змінні цього типу:

ElementaryFunction f1 = new ElementaryFunction(Math.Sin);

ElementaryFunction f2 = Math.Exp;

ElementaryFunction f3;

f3 = Math.Atan; // присвоюємо об’єкту-змінній f3 адресу функції обчислення арктангенса

Далі викликати, наприклад, функцію обчислення синуса можна через об’єкт-змінну f1:

double y = f1(3.1415926); // виклик функції sin(3.1415926)

Делегати також можуть містити посилання на методи екземплярів класу. Наприклад:

class MyFunction

{

public double MySin(double x)

{

return Math.Sin(x);

}

}

У цьому випадку для всякого делегату ElementaryFunction є можливість присвоїти адресу методу MySin через довільний екземпляр класу MyFunction:

MyFunction MyF = new MyFunction();

ElementaryFunction f5 = MyF.MySin;

Делегати також можуть вказувати на методи, що містять будь-яку кількість параметрів out, ref та масивів параметрів, позначених ключовим словом params.

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