Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.

Презентация:



Advertisements
Похожие презентации
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Advertisements

Высокоуровневые методы информатики и программирования Лекция 10 События.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Делегаты Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.
ДелегатыСобытия Лекция 7. Делегаты Одиночные делегаты Цепочка делегатов Обобщенные делегаты Анонимные методы Лямбда выражения Замыкания Ковариантность.
Киньзибаев Рашид. тип объектов, которые могут ссылаться на метод.
Делегаты Делегат эти объект, который безопасно инкапсулирует метод, его действие схоже с указателем функции в C и C++. Делегаты используются для передачи.
ИТЕРАТОРЫ И LINQ Лекция 1. Интерфейс IEnumerable и IEnumerator Любая коллекция реализует интерфейс IEnumerable. public interface IEnumerable : IEnumerable.
СОБЫТИЯ Лекция 1. Взаимодействие объектов 2 Взаимодействие между объектами A и B можно организовать двумя способами. 1.Объект A вызывает метод объекта.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Особенности C# Индексаторы, события, частичные методы, расширяющие методы, сборщик мусора DraggonZ.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Основы информатики Лекция. Функции Заикин Олег Сергеевич
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Обобщения ( шаблоны ) Лекция 5. Тип, метод или интерфейс параметризованный другим типом Обобщенный тип Тип ( класс, структура ), который параметризован.
Лекция 2: Описание класса 1. Поля 2. Методы 3. Конструкторы.
Транксрипт:

Высокоуровневые методы информатики и программирования Лекция 9 Делегаты

План работы Понятие делегатов. Описание новых delegate типов. Операции над делегатами. Использование делегатов. Стандартные делегаты. Лямбда выражения.

Делегаты - delegate В программе часто требуется хранить и передавать адреса методов. – Функции обратного вызова (callback functions, callbacks). – Используя callbacks можно указать, чтобы одна функция обращалась к другой функции. – С помощью этого подхода разработчики в Win32 могут обрабатывать нажатие клавиш, движение мыши, выбор пунктов меню. Для реализации обратных вызовов в C# используется новая разновидность пользовательских типов - delegate (делегат). C помощью данного типа описываются типы данных, которые могут хранить ссылки на методы с заданной сигнатурой. C использование ключевого слова delegate можно описать новый тип. – Новый тип можно описать с помощью класса: class xxxx {...} – И новый тип можно описать с помощью делегата: delegate

Операции над переменными типа delegate Тип delegate поддерживает три важных элемента информации: – Адрес метода на который он ссылается. – Параметры (если они есть) данного метода. – Возвращаемое методом значение. После того, как тип delegate описан можно создавать экземпляры данного типа (переменные) Этим переменным можно присваивать ссылки на методы с заданной сигнатурой. После задания ссылки на метод этот метод можно вызывать с помощью переменной delegate с помощью операции (). Для описания типа делегата нужно указать ключевое слово delegate после которого задать сигнатуру, которой он должен соответствовать.

Описание нового типа Сигнатура это – тип возвращаемого значения – последовательность типов передаваемых параметров Например: int Func (int a; float b)

Когда компилятор обработает описание типа делегата, то он создает класс производный от класса System.MulticastDelegate. Этот класс (вместе со своим базовым классом System.Delegate) предоставляет переменным данного типа необходимую инфраструктуру для хранения списка ссылок на методы с заданной сигнатурой, которые могут быть позднее вызваны. Методы – Конструктор с одним параметром – названием метода. – Базовый метод Invoke() (для синхронного вызова) – Методы BeginInvoke() и EndInvoke() для асинхронного вызова. – Метод Delegate[] GetInvocationList() – возвращает массив переменных типа System.Delegate, каждая из которых представляет конкретный метод, который может быть вызван. Переопределены операции – = – != – == – += (Delegate.Combine()) – -= (Delegate.Remove())

Пример Например, нужно создать тип делегата с именем BinaryOp, который может хранить ссылки на любые методы, которые возвращают целые значения и принимают в параметры целого типа: // This delegate can point to any method, // taking two integers and returning an integer. public delegate int BinaryOp(int x, int y); Создается автоматически класс sealed class BinaryOp : System.MulticastDelegate { public BinaryOp(object target, uint functionAddress); public int Invoke(int x, int y); public IAsyncResult BeginInvoke(int x, int y, AsyncCallback cb, object state); public int EndInvoke(IAsyncResult result); }

Другой пример public delegate string MyDelegate(bool a, bool b, bool c); В этот раз будет создан следующий класс sealed class MyDelegate : System.MulticastDelegate { public MyDelegate(object target, uint functionAddress); public string Invoke(bool a, bool b, bool c); public IAsyncResult BeginInvoke(bool a, bool b, bool c, AsyncCallback cb, object state); public string EndInvoke(IAsyncResult result); }

Использование делегатов Объявление нового типа ссылок с помощью типа delegate: delegate (формальные параметры); Например: public delegate int MyFunc(int n); Создание экземпляра нового типа ссылок = new (имя функции); Например: int myFunction(int k) { return (2*k);}... f = new MyFunc (myFunction); Использование экземпляра делегата (вызов методов, ссылки на которые сохранены) – задание ссылки: = new ( ); = ; – вызов методов (фактические параметры); Например: int n = f(5); Будут вызываться последовательно все методы, ссылки на которые сохранены

Пример // объявляем новый тип public delegate int MyFunc(int n); // создаем метод int myFunction(int k) { return (2*k);}... // создаем экземпляр ссылки на методы MyFunc f; // задаем значение экземпляру (присвоение ссылки) f = new MyFunc (myFunction); // или f = myFunction; // упрощенный вариант // вызов метода с использованием ссылки int n = f(5);

Пример работы с делегатом // объявление нового типа ссылок на методы public delegate int MyFunc(int n); // объявление о переменной – ссылке на метод MyFunc rf = new MyFunc (Calc); // или rf = Calc; // вызов метода с помощью ссылки int k = f(5);... public static int Calc (int n) { … }

Стандартные делегаты В библиотеке FCL описаны стандартные обобщенные делегаты, которые активно используются в методах классов библиотеки: System.Action() – принимает значение (или значения) и ничего не возвращает; public delegate void Action ( T obj ) System.Comparison() – принимает два параметра и возвращает целое значение ( 0: x > y) public delegate int Comparison ( T x, T y ) System.Converter() – преобразование объекта из одного типа в другой public delegate TOutput Converter ( TInput input ) System.EventHandler – обработчик событий public delegate void EventHandler ( Object sender, TEventArgs e ) where TEventArgs : EventArgs System.Func() – принимает значение (или значения) и возвращает результат public delegate TResult Func ( T arg ) System.Predicate() – принимает значение и возвращает bool public delegate bool Predicate ( T obj )

Анонимные методы Это блок операторов, который используется в качестве параметра для используемого делегата. Например: Compute func1 = delegate(float a, float b) { float с = a+b; return c; }; Преимуществом анонимных методов - уменьшается объем кода, не нужно описывать метод только для того, чтобы использовать его с делегатом. Такой способ удобен при задании делегатов для событий. Используя экземпляр делегата можно вызвать метод, ссылка на который хранится в нем, используя обычную запись вызова методов. Например: float b = func(2.5F, 3.4F); Например: public MyForm() { listBox = new ListBox(...); textBox = new TextBox(...); addButton = new Button(...); addButton.Click += delegate { listBox.Items.Add(textBox.Text); }; }

Лямбда выражения Лямбда выражения это анонимные методы (функции), которые могут содержать выражения и операторы и могут использоваться для создания делегатов или деревьев выражений (expression tree types). Все lambda выражения используют лямбда операция =>, который читается как "перейти к". С левой стороны lambda операции задаются входные параметры (если они есть), а с правой стороны задается блок с выражениями и операторами. (input parameters) => expression Например, лямбда выражение x => x * x читается, как "x переходит к x умноженному на x." Данное лямбда выражение может быть присвоено типу delegate следующим образом: delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 } Способ записи (int x) => x + 1 ; // is the same as (int x) => { return x + 1; }

Примеры multicasting ссылок // объявление делегата public delegate int Func(int n); // объявление переменной типа delegate Func a; a = new Func (myFunction); // a = myFunction; a += new Func (Calc); // a += Calc;... // вызов методов по ссылке n = a(5); …. int myFunction (int n) { … } int Calc (int n) { … }...