Пример делегата для метода класса

Лекция 20, 21. Делегаты и события

Делегат – особый вид класса,хранящий ссылки на методы.

Делегат – класс (ссылочный тип), инкапсулирующий (содержащий в себе) метод с указанной сигнатурой и возвращаемым типом.

Все делегаты являются объектами типа System.Delegate или System.MulticastDelegate.

Общий синтаксис объявления делегата:

[cпецификаторы] delegate тип возвращаемого значения метода имя делегата ([параметры]), где

delegate – ключевое слово.

тип возвращаемого значения – это тот тип, который будет возвращать функция, на которую ссылается делегат.

параметры – это необязательные параметры, которые будут присутствовать у функции, на которую ссылается делегат.

Примеры объявления делегата:

delegate void MyDelegate(string s); //делегат, который может работать для всех методов, которые возвращают тип void и имеют один строковый параметр.

public delegate int mydel();

delegate double MyD (double x);

//”Почти универсальный делегат”

delegate void My (object o)

Алгоритм работы с делегатом:

1. Объявление делегата;

2. Определение метода, “подходящего” для работы с делегатом

3. В основной программе создание экземпляра делегата и связь его с определённой функцией;

4. Вызов метода через делегат.

Делегат может быть применён:

· Для обычной функции без класса;

· Для метода внутри класса.

Пример делегата для обычной функции

class Program

{

//объявление делегата

delegate void MyDelegate(string s);

static void Myfunc(string s)

{

Console.WriteLine(s);

}

static void Main(string[] args)

{

//в конструкторе передается ссылка на функцию, которая делегируется (связыватся с делегатом)

MyDelegate del = new MyDelegate(Myfunc);//создание экземпляра делегата

del("Hello World");//вызов функции через делегат

Console.ReadKey();

}

}

Пример делегата для метода класса

namespace ConsoleApplication1

{

class my

{

public string mystring;//поле класса

public void Myfunc(string s)

{

// Вывод значения поля mystring, а также аргумента, переданного методу.

Console.WriteLine(mystring + s);

}

}

class Program

{

//объявление делегата

delegate void MyDelegate(string s);

static void Main(string[] args)

{

// Создадим экземпляр тестового класса.

my A = new my();

// Создадим экземпляр делегата, содержащего, помимо ссылки на сам метод, также ссылку

// на объект, для которого будет вызван метод.

MyDelegate del = new MyDelegate(A.Myfunc);

// Изменяем значение поля тестового объекта.

A.mystring = "Hello, World!";

// Вызовем метод через делегат.

del(" - from Delegate");

// Эквивалентен следующему вызову

// A.Myfunc(" - from Instance Delegate");

// Снова изменим значение поля тестового объекта.

A.mystring = "Good bye, World!";

// Снова обратимся к методу.

del(" - from Delegate");

Console.ReadKey(); } }}

Операции с делегатами: =,!=, +=,-=,= =.

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

С делегатами одного типа можно выполнить операции простого и сложного присваивания: =, +=,-=.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: