Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


Download 2.46 Mb.
bet52/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   48   49   50   51   52   53   54   55   ...   91
Bog'liq
Язык программирования C#

12. ДЕЛЕГАТЫ. СОБЫТИЯ

Неотъемлемой частью в практике современного программирования стало использование обратных вызовов (callback) и уведомлений (notification). Основанные на них приемы нашли широкое применение в написании кода. К тому же в последнее время стало все больше распространяется программирование с использованием событий (заметим, что события реализуются с помощью уведомлений). На механизме событий основано все Windows программирование. Для реализации вышеупомянутых действий (обратных вызовов и уведомлений) в C# используются делегаты.




12.1. Понятие делегата

Делегат – это пользовательский тип данных, объекты которого способны ссылаться на один или более методов. Делегаты введены в C# и других языках технологии Microsoft .NET реализованной в виде платформы .NET Framework для определения прототипа функции обратного вызова. Из объявления типа делегата компилятор генерирует класс, производный от System.Delegate.


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

[спецификатор_доступа] воз_тип delegate имя_делегата([тип_1 Пер1],..,[типN ПерN]);


В этой схеме воз_тип – тип возвращаемого методом, на который ссылается делегат значения, тип1, …, типN – типы формальных параметров, которые ожидает этот метод. Пер1,.., ПерN – имена формальных параметров, они могут быть любыми, их наличие лишь требование синтаксиса, по моему мнению, излишние.


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


12.2. Использование делегатов

Для определения делегата используется ключевое слово delegate. Делегаты могут быть определены внутри пространств имен, классов или структур. Соответственно к делегатам применимы следующие спецификаторы доступа: public, private, internal.


Приведем несколько примеров создания делегатов:
1. Делегат не принимает параметров и не возвращает никаких значений.

public delegate void Del();


Лист. 3.1

2. Делегат принимает две строки и возвращает логическое значение.


public delegate bool Check(string Username, string Passward);


Лист. 3.2

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


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

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


public class SecurityInfo


{
string UserName, Password;
public SecurityInfo(string Name, string Pass)
{
UserName = Name;
Password = Pass;
}

public bool CheckInfo(string Name, string Pass)


{
return (Name == UserName & Pass == Password);
}
}
Лист. 3.3

В этом классе определена функция CheckInfo получающая два параметра типа string и возвращающая логическое значение bool. Ее мы впоследствии будем вызывать посредством делегата. Для этого определим это делегат с такой же, как у метода CheckInfo сигнатурой.


public delegate bool Check(string Name, string Pass);
Лист. 3.4

Теперь определим основной класс программы и в нем точку входа – метод Main.


class Program


{
static void Main(string[] args)
{
SecurityInfo securityInfo = new SecurityInfo("tsalik","password");
Check passCheck = new Check(securityInfo.CheckInfo);

string Name = "tsalik", Pass = "password";


if (passCheck(Name, Pass))
Console.WriteLine("Right Password");
else
Console.WriteLine("Wrong Password");
}
}
Лист. 3.5

Сначала в методе Main создается объект класса SecurityInfo securityInfo, затем мы создаем делегат passCheck типа Check, используя для этого метод CheckInfo объекта securityInfo


Check passCheck = new Check(securityInfo.CheckInfo);


Лист. 3.6

Эту запись можно заменить на аналогичную, но более натуральную.


Check passCheck = securityInfo.CheckInfo;


Лист. 3.7
Далее происходит вызов метода CheckInfo объекта securityInfo посредством ссылающегося на этот метод делегата passCheck.

if (passCheck(Name, Pass))


Лист. 3.8

Результат, выводимый программой.


Right Password


Вывод. 3.1

Из приведенного примера видно, что делегат хранит в себе ссылку не только на метод, но и на объект, содержащего этот метод. Делегат может хранить в себе также ссылки на статические методы. Если делегат ссылается на статическую функцию, то указатель на объект равен null.





Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   48   49   50   51   52   53   54   55   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling