
- •Тема 1 Колекції Структури даних
- •Неузагальнені колекції
- •Деякі інтерфейси неузагальнених колекцій
- •Деякі класи неузагальнених колекцій
- •Узагальнені колекції
- •Тема 2 Файловий ввід-вивід Організація файлового вводу-виводу
- •Байтовий ввід-вивід у файл
- •Двійковий ввід-вивід у файл
- •Символьний ввід-вивід у файл
- •Організація роботи із файлами даних стандарту xml
- •Простір імен System.Xml
- •Класи XmlNode та XmlLinkedNode
- •Клас XmlDeclaration
- •Класи XmlComment та XmlAttribute
- •Клас XmlElement
- •Клас XmlDocument
- •Приклад
- •Тема 3 Делегати та події Клас delegate
- •Делегати в якості параметрів
- •Анонімні методи та узагальнені делегати System.Action, System.Func
- •Комбіновані делегати та шаблон «спостерігач»
- •Події: створення та обробка
Тема 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.