Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

4. Групповое преобразование делегируемых методов

Ещё в версии С# 2.0 было внедрено специальное средство, существенно упрощающее синтаксис присваивания метода делегату. Это так называемое групповое преобразование методов, позволяющее присвоить имя метода делегату, не прибегая к оператору new или явному вызову конструктора делегата. Пример:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

// Создаём делегат

delegate int IntOperation(int i, int j);

class Program

{

// Организуем ряд методов

static int Sum(int x, int y)

{

return x + y;

}

static int Prz(int x, int y)

{

return x * y;

}

static int Del(int x, int y)

{

return x / y;

}

static void Main()

{

// Присваиваем имя метода обычным способом

IntOperation op1 = new IntOperation(Sum);

// Используем групповое преобразование

op1 = Sum;

int result = op1(5, 10);

Console.WriteLine("Сумма: " + result);

// Изменим ссылку на метод

op1 = Prz;

result = op1(5, 10);

Console.WriteLine("Произведение: " + result);

Console.WriteLine("Для продолжения нажмите любую клавишу . . .");

Console.ReadKey();

}

}

}

Синтаксис группового преобразования методов существенно упрощён по сравнению с прежним подходом к делегированию.

5. Применение методов экземпляра в качестве делегатов

В предыдущем примере использовались статические методы, но делегат может ссылаться и на методы экземпляра, хотя для этого требуется ссылка на объект. Так, ниже приведен измененный вариант предыдущего примера, в котором операции с числами инкапсулируются в классе MyClass. Следует заметить, что в данном случае может быть также использован синтаксис группового преобразования методов:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

// Создаём делегат

delegate int IntOperation(int i, int j);

public class MyClass

{

public static int Sum(int x, int y)

{

return x + y;

}

public static int Prz(int x, int y)

{

return x * y;

}

public static int Del(int x, int y)

{

return x / y;

}

}

class Program

{

static void Main()

{

// Инициализируем делегат

IntOperation op1 = MyClass.Sum;

int result = op1(5, 10);

Console.WriteLine("Сумма: " + result);

op1 = MyClass.Prz;

result = op1(5, 10);

Console.WriteLine("Произведение: " + result);

Console.WriteLine("Для продолжения нажмите любую клавишу . . .");

Console.ReadKey();

}

}

}

/* Выведет:

* Сумма: 15

* Произведение: 50

* Для продолжения нажмите любую клавишу . . .

*/

Результат выполнения этого кода получается таким же, как и в предыдущих примерах, но на этот раз делегат обращается к методам по ссылке на статические методы класса MyClass.