пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Делегаты в C#, назначение и использование делегатов. Использование делегатов для обратного вызова экземплярных методов.

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

По сути, делегат — это безопасный в отношении типов объект, указывающий на другой метод (или, возможно, список методов) приложения, который может быть вызван позднее. В частности, объект делегата поддерживает три важных фрагмента информации:

· адрес метода, на котором он вызывается;

· аргументы (если есть) этого метода;

· возвращаемое значение (если есть) этого метода.

Как только делегат создан и снабжен необходимой информацией, он может динамически вызывать методы, на которые указывает, во время выполнения. Каждый делегат в .NET Framework (включая специальные делегаты) автоматически снабжается способностью вызывать свои методы синхронно или асинхронно. Этот факт значительно упрощает задачи программирования, поскольку позволяет вызывать метод во вторичном потоке выполнения без ручного создания и управления объектом Thread.

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

MyDelegate del = new MyDelegate(sc.MyHandler);

Где sc является ссылкой на экземпляр объекта, который должен использоваться при обращении к методу MyHandler.

Приведу пример, демонстрирующий работу с подобными делегатами. Дабы излишне не запутывать читателя, а также упростить чтение листинга примера, в него введен дополнительный класс. В классе описан метод, на который будет ссылаться делегат. Данный метод будет использовать поле класса, что позволит нам следить за работой метода, изменяя его (листинг 3). Листинг 3. Использование делегата для обращения к экземплярному методу.

using System; class SomeClass { // Поле класса.// Ни у кого не должно возникать сомнений, что оно// напрямую связано с экземпляром данного типа.publicstring SomeField; // Обычный метод, связанный с экземпляром типа.// Его будем вызывать при помощи делегата.publicvoid MyHandler(string s) { // Выведем на консоль значение поля SomeField, а также// аргумент, переданный методу. Console.WriteLine(SomeField + s); } };

// Основной класс приложения.class App { delegatevoid MyDelegate(string s); staticvoid Main() { // Создадим экземпляр тестового класса. SomeClass sc = new SomeClass(); // Создадим экземпляр делегата, содержащего,// помимо ссылки на сам метод, также ссылку// на объект, для которого будет вызван метод. MyDelegate del = new MyDelegate(sc.MyHandler); // Изменяем значение поля тестового объекта. sc.SomeField = "Hello, World!"; // Вызовем метод через делегат. del(" - from Instance Delegate"); // Эквивалентен следующему вызову// sc.MyHandler(" - from Instance Delegate");// Снова изменим значение поля тестового объекта. sc.SomeField = "Good bye, World!"; // Снова обратимся к методу. del(" - from Instance Delegate"); } };

В результате работы приложения на консоль будут выведены следующие строки.

Hello, World! - from Instance Delegate Good bye, World! - from Instance Delegate

Видно, что метод действительно был вызван от нужного объекта. Изменения, внесенные в объект после первого обращения к методу, естественно, отразились на втором обращении к нему.

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

 

 

 

 


11.01.2019; 17:06
хиты: 108
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь