SlideShare uma empresa Scribd logo
1 de 24
Курс по програмиране на
C#
Занятие №9
Делегати. Събития.
Ламбда функции

2013
Съдържание 1/1
• Делегати
• Събития
• Ламбда функции
Къде е грешката в кода?
abstract class Vehicle
{
public abstract void Move();
}

class Car : Vehicle
{
public override void Move(double distance)
{
Console.WriteLine("The car moved {0}km.", distance);
}
}
class Motorcycle : Vehicle
{
public int EngineVolume { get; set; }
}
Къде е проблемът в кода?
class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
public class BooksCollection
{
private readonly Book[] _books = new Book[100];
public Book this[int index]
{
get { return _books[index] }
set { _books[index] = value; }
}
public string this[string title]
{
get
{
foreach (Book book in _books)
{
if (book != null && book.Title == title)
return book.ToString();
}
return null;
}
}
}
Къде е грешката в кода?
interface INamedObject
{
string Name { get; }
}
interface IPet : INamedObject
{
int Age { get; }
bool IsVaccinated { get; }
}
class Animal
{
public int Age;
}
class Dog : IPet, Animal
{
public string Name;
public bool IsVaccinated;
}
Делегати
• Какво е „делегат“?
– Тип данни
– Множеството от стойности са функциите с конкретен
брой и тип параметри и тип на резултата
– Служи за съхраняване и предаване на функции като
данни
– В C# наследява класа System.MulticastDelegate
Делегати
• Деклариране на делегати
–
–
–
–

Ключова дума delegate
Тип на връщания резултат
Наименование – идентификатор в Pascal case
Списък от параметри

delegate int BinaryOperation(int x, int y);
delegate void Action();
delegate T Transformation<T>(T param);
Делегати
• Използване на делегати
– Могат да бъдат използвани навсякъде, както
останалите типове данни
– Автоматично генериран конструктор с един
параметър
– В аргумента на конструктора се поставя обръщение
към метод без кръгли скоби с аргументи; методът
трябва да бъде със съответстващи на делегата
параметри и тип на резултата
– Функцията, към която сочи делегатната инстанция,
може да бъде изпълнена, като се поставят аргументи в
скоби след наименованието на променливата
Делегати
delegate int BinaryOperation(int x, int y);
class Calculator
{
public int Calculate(int x, int y, BinaryOperation operation)
{
return operation(x, y);
}
}
class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
int result = calculator.Calculate(3, 5, new BinaryOperation(Sum));
Console.WriteLine(result);
Console.ReadLine();
}
public static int Sum(int x, int y)
{
return x + y;
}
}
Делегати
• Използване на делегати
– Може конструирането на делегатна инстанция да се
замести директно с обръщение към метод без кръгли
скоби с аргументи
class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
int result = calculator.Calculate(3, 5, Sum);
Console.WriteLine(result);
Console.ReadLine();
}
public static int Sum(int x, int y)
{
return x + y;
}
}
Делегати
• Приложение на делегатите
– Изпълнение на различни операции (определяни по
време на изпълнение) върху еднотипни данни
– Реализиране на взаимодействие между обекти чрез
събития
– Функции от по-висок ред – доближават C# до
функционалното програмиране
Събития
• Какво е „събитие“?
– Член на клас, структура или интерфейс
– Служи за реализиране на взаимодействия между
обекти
– Тип на делегат и наименование
– Уникалност на наименованията
– Много делегатни инстанции могат да бъдат закачени
към едно събитие
– При предизвикването на събитието се изпълняват
последователно функциите във всички закачени
делегатни инстанции
Събития
• Деклариране на събития
Ключова дума event
Тип на делегата
Наименование
Опционално: тяло с add и remove блокове, които
вътрешно закачат/откачат подадения параметър
към/от поле със същия тип
– Ако тялото е пропуснато, компилаторът създава
вътрешно поле, в което да съхранява списъка от
закачени делегатни инстанции (автоматично
генерирано събитие)
–
–
–
–
Събития
delegate void NotificationHandler(object data);
class Notifier
{
public void Notify(object data)
{
if (Notification != null)
Notification(data);
}
public event NotificationHandler Notification;
}
Събития
• Използване на събития
– Не се допуска директно присвояване на стойност на
събитието
– Закачане (абониране) за събитие – с оператора +=
– Откачане от събитие – с оператора -=
– Преди да предизвикаме събитието, проверяваме дали
е различно от null
– Ако събитието е декларирано с тяло, не изпълняваме
събитието, а полето, което съхранява списъка с
делегатни инстанции
Събития
delegate void NotificationHandler(object data);
class Notifier
{
public void Notify(object data)
{
if (Notification != null)
Notification(data);
}
public event NotificationHandler Notification;
}
class Program
{
static void Main(string[] args)
{
Notifier notifier = new Notifier();
notifier.Notification += new NotificationHandler(Notifier_Notification);
notifier.Notify(42);
Console.ReadLine();
}
public static void Notifier_Notification(object data)
{
Console.WriteLine("Received notification with data: {0}", data);
}
}
Събития
• Приложение на събитията
– Взаимодействия между обекти
– Програмиране, базирано на събития
– Приложения с графичен потребителски интерфейс
Ламбда функции
• Какво е „ламбда функция“?
– Специален синтаксис за създаване на делегатна
инстанция
– Може да се декларира директно в тялото на друг
метод или дори на друга ламбда функция
– Параметри и тяло; тип на връщания резултат
– Може да използва локалните променливи на метода,
в който е декларирана
Ламбда функции
• Деклариране на ламбда функции
– Параметър или списък от параметри (без
декларирани типове)
– Оператор =>
– Израз или блок
– Типа на резултата се определя от типа на израза, или
от типа на аргумента на return в тялото
Ламбда функции
delegate int BinaryOperation(int x, int y);
class Calculator
{
public int Calculate(int x, int y, BinaryOperation operation)
{
return operation(x, y);
}
}
class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
int result = calculator.Calculate(3, 5, (x, y) => x + y);
Console.WriteLine(result);
Console.ReadLine();
}
}
Ламбда функции
delegate void NotificationHandler(object data);
class Notifier
{
public void Notify(object data)
{
if (Notification != null)
Notification(data);
}
public event NotificationHandler Notification;
}
class Program
{
static void Main(string[] args)
{
Notifier notifier = new Notifier();
notifier.Notification +=
data =>
{
Console.WriteLine("Received notification with data: {0}", data);
};
notifier.Notify(42);
Console.ReadLine();
}
}
Ламбда функции
• Приложение на ламбда функциите
– Кратък запис на делегатна инстанция
– Подходящо, ако делегатната инстанция ще се ползва
само на едно място в кода
– Нужно, когато делегатната инстанция трябва да
достъпва локални променливи на метода, в който е
декларирана
– Сходство с функционалното програмиране
– По-четим код
Въпроси?
Благодаря!
• Александър Далемски
–
–
–
–

sasho@david.bg
musashi.bg@gmail.com
Skype: musasho
https://www.facebook.com/adalemski

• ДАВИД академия
–
–
–
–

acad@david.bg
http://acad.david.bg/
@david_academy
https://www.facebook.com/groups/david.academy/

Mais conteúdo relacionado

Mais procurados

Llibri-i-mesuesit-matematika-11
Llibri-i-mesuesit-matematika-11Llibri-i-mesuesit-matematika-11
Llibri-i-mesuesit-matematika-11
Ferit Fazliu
 
Customer Relationship Management (CRM) sistemet
Customer Relationship Management (CRM) sistemetCustomer Relationship Management (CRM) sistemet
Customer Relationship Management (CRM) sistemet
yllferizi
 
Leksionete gjenetikespop1(ndryshuar)
Leksionete gjenetikespop1(ndryshuar)Leksionete gjenetikespop1(ndryshuar)
Leksionete gjenetikespop1(ndryshuar)
nilaalila123
 
-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf
-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf
-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf
Vieni Dapaj
 
защо врабчо не отиде в топлите страни
защо врабчо не отиде в топлите странизащо врабчо не отиде в топлите страни
защо врабчо не отиде в топлите страни
Лидия Ганева
 
strategjia e vendosjes se çmimeve
strategjia e vendosjes se çmimevestrategjia e vendosjes se çmimeve
strategjia e vendosjes se çmimeve
Egzon Deda
 
trajtimi ekologjik i mbeturinave
trajtimi ekologjik i mbeturinavetrajtimi ekologjik i mbeturinave
trajtimi ekologjik i mbeturinave
ornela rama
 
Bazat e Te Dhenave - ACCESS
Bazat e Te Dhenave  - ACCESSBazat e Te Dhenave  - ACCESS
Bazat e Te Dhenave - ACCESS
Ajla Hasani
 

Mais procurados (20)

Llibri-i-mesuesit-matematika-11
Llibri-i-mesuesit-matematika-11Llibri-i-mesuesit-matematika-11
Llibri-i-mesuesit-matematika-11
 
Xhesika xhika
Xhesika xhikaXhesika xhika
Xhesika xhika
 
Customer Relationship Management (CRM) sistemet
Customer Relationship Management (CRM) sistemetCustomer Relationship Management (CRM) sistemet
Customer Relationship Management (CRM) sistemet
 
Projekt biologji zhvillimi
Projekt biologji zhvillimiProjekt biologji zhvillimi
Projekt biologji zhvillimi
 
PLANIFIKIMI LËNDOR KURRIKULA E RE byirenakotobelli
PLANIFIKIMI LËNDOR KURRIKULA E RE byirenakotobelliPLANIFIKIMI LËNDOR KURRIKULA E RE byirenakotobelli
PLANIFIKIMI LËNDOR KURRIKULA E RE byirenakotobelli
 
RUBRIKA : TE FAMSHEM ...ALBERT AJNSHTANJ
 RUBRIKA :  TE  FAMSHEM ...ALBERT AJNSHTANJ  RUBRIKA :  TE  FAMSHEM ...ALBERT AJNSHTANJ
RUBRIKA : TE FAMSHEM ...ALBERT AJNSHTANJ
 
Leksionete gjenetikespop1(ndryshuar)
Leksionete gjenetikespop1(ndryshuar)Leksionete gjenetikespop1(ndryshuar)
Leksionete gjenetikespop1(ndryshuar)
 
PROJEKT MATEMATIKE
PROJEKT MATEMATIKE PROJEKT MATEMATIKE
PROJEKT MATEMATIKE
 
Shpend Stojkaj baza e të dhënave
Shpend Stojkaj baza e të dhënaveShpend Stojkaj baza e të dhënave
Shpend Stojkaj baza e të dhënave
 
ushtrime matlab
ushtrime matlab ushtrime matlab
ushtrime matlab
 
C++-Projekt
C++-ProjektC++-Projekt
C++-Projekt
 
Bazat e programimit ne C++ (agni dika)
Bazat e programimit ne C++  (agni dika)Bazat e programimit ne C++  (agni dika)
Bazat e programimit ne C++ (agni dika)
 
-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf
-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf
-funksionet-kuadratik-eksponencial-dhe-logaritmik-pdf
 
Paaftesia ne nxene si problem social
Paaftesia ne nxene si problem socialPaaftesia ne nxene si problem social
Paaftesia ne nxene si problem social
 
защо врабчо не отиде в топлите страни
защо врабчо не отиде в топлите странизащо врабчо не отиде в топлите страни
защо врабчо не отиде в топлите страни
 
PUNIM SHKENCOR..MATEMATIKE ...!!!
PUNIM  SHKENCOR..MATEMATIKE ...!!!PUNIM  SHKENCOR..MATEMATIKE ...!!!
PUNIM SHKENCOR..MATEMATIKE ...!!!
 
strategjia e vendosjes se çmimeve
strategjia e vendosjes se çmimevestrategjia e vendosjes se çmimeve
strategjia e vendosjes se çmimeve
 
trajtimi ekologjik i mbeturinave
trajtimi ekologjik i mbeturinavetrajtimi ekologjik i mbeturinave
trajtimi ekologjik i mbeturinave
 
Bazat e Te Dhenave - ACCESS
Bazat e Te Dhenave  - ACCESSBazat e Te Dhenave  - ACCESS
Bazat e Te Dhenave - ACCESS
 
Bio.
Bio.Bio.
Bio.
 

Semelhante a Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции

8. vb sabitijno programirane
8. vb sabitijno programirane8. vb sabitijno programirane
8. vb sabitijno programirane
dnaidenowa
 
Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Информационни системи - упражнение № 2
Информационни системи - упражнение № 2
Tsvetelin Pavlov
 
Svetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework Overview
Svetlin Nakov
 

Semelhante a Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции (20)

Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14
 
C++ OpenFest 2015
C++ OpenFest 2015C++ OpenFest 2015
C++ OpenFest 2015
 
Presentation on SOLID design principles
Presentation on SOLID design principlesPresentation on SOLID design principles
Presentation on SOLID design principles
 
.NET/C#_7
.NET/C#_7.NET/C#_7
.NET/C#_7
 
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLКурс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
 
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11
 
Eclipse Editors@TUES (Part 2)
Eclipse Editors@TUES (Part 2)Eclipse Editors@TUES (Part 2)
Eclipse Editors@TUES (Part 2)
 
Демо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин НаковДемо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин Наков
 
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
 
Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2
 
AJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузърAJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузър
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8
 
8. vb sabitijno programirane
8. vb sabitijno programirane8. vb sabitijno programirane
8. vb sabitijno programirane
 
Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Информационни системи - упражнение № 2
Информационни системи - упражнение № 2
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13
 
Svetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework Overview
 
JFace@TUES
JFace@TUESJFace@TUES
JFace@TUES
 
R
RR
R
 

Mais de DAVID Academy

Mais de DAVID Academy (20)

Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
 
Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSS
 
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTML
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSS
 
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTML
 
Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10
 
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9
 
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - Помагало
 
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - Упражнения
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3
 
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web Services
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
 
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
 
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
 
Курс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. ПредставянеКурс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. Представяне
 
Курс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоКурс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - Помагало
 

Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции

  • 1. Курс по програмиране на C# Занятие №9 Делегати. Събития. Ламбда функции 2013
  • 2. Съдържание 1/1 • Делегати • Събития • Ламбда функции
  • 3. Къде е грешката в кода? abstract class Vehicle { public abstract void Move(); } class Car : Vehicle { public override void Move(double distance) { Console.WriteLine("The car moved {0}km.", distance); } } class Motorcycle : Vehicle { public int EngineVolume { get; set; } }
  • 4. Къде е проблемът в кода? class Book { public string Title { get; set; } public string Author { get; set; } } public class BooksCollection { private readonly Book[] _books = new Book[100]; public Book this[int index] { get { return _books[index] } set { _books[index] = value; } } public string this[string title] { get { foreach (Book book in _books) { if (book != null && book.Title == title) return book.ToString(); } return null; } } }
  • 5. Къде е грешката в кода? interface INamedObject { string Name { get; } } interface IPet : INamedObject { int Age { get; } bool IsVaccinated { get; } } class Animal { public int Age; } class Dog : IPet, Animal { public string Name; public bool IsVaccinated; }
  • 6. Делегати • Какво е „делегат“? – Тип данни – Множеството от стойности са функциите с конкретен брой и тип параметри и тип на резултата – Служи за съхраняване и предаване на функции като данни – В C# наследява класа System.MulticastDelegate
  • 7. Делегати • Деклариране на делегати – – – – Ключова дума delegate Тип на връщания резултат Наименование – идентификатор в Pascal case Списък от параметри delegate int BinaryOperation(int x, int y); delegate void Action(); delegate T Transformation<T>(T param);
  • 8. Делегати • Използване на делегати – Могат да бъдат използвани навсякъде, както останалите типове данни – Автоматично генериран конструктор с един параметър – В аргумента на конструктора се поставя обръщение към метод без кръгли скоби с аргументи; методът трябва да бъде със съответстващи на делегата параметри и тип на резултата – Функцията, към която сочи делегатната инстанция, може да бъде изпълнена, като се поставят аргументи в скоби след наименованието на променливата
  • 9. Делегати delegate int BinaryOperation(int x, int y); class Calculator { public int Calculate(int x, int y, BinaryOperation operation) { return operation(x, y); } } class Program { static void Main(string[] args) { Calculator calculator = new Calculator(); int result = calculator.Calculate(3, 5, new BinaryOperation(Sum)); Console.WriteLine(result); Console.ReadLine(); } public static int Sum(int x, int y) { return x + y; } }
  • 10. Делегати • Използване на делегати – Може конструирането на делегатна инстанция да се замести директно с обръщение към метод без кръгли скоби с аргументи class Program { static void Main(string[] args) { Calculator calculator = new Calculator(); int result = calculator.Calculate(3, 5, Sum); Console.WriteLine(result); Console.ReadLine(); } public static int Sum(int x, int y) { return x + y; } }
  • 11. Делегати • Приложение на делегатите – Изпълнение на различни операции (определяни по време на изпълнение) върху еднотипни данни – Реализиране на взаимодействие между обекти чрез събития – Функции от по-висок ред – доближават C# до функционалното програмиране
  • 12. Събития • Какво е „събитие“? – Член на клас, структура или интерфейс – Служи за реализиране на взаимодействия между обекти – Тип на делегат и наименование – Уникалност на наименованията – Много делегатни инстанции могат да бъдат закачени към едно събитие – При предизвикването на събитието се изпълняват последователно функциите във всички закачени делегатни инстанции
  • 13. Събития • Деклариране на събития Ключова дума event Тип на делегата Наименование Опционално: тяло с add и remove блокове, които вътрешно закачат/откачат подадения параметър към/от поле със същия тип – Ако тялото е пропуснато, компилаторът създава вътрешно поле, в което да съхранява списъка от закачени делегатни инстанции (автоматично генерирано събитие) – – – –
  • 14. Събития delegate void NotificationHandler(object data); class Notifier { public void Notify(object data) { if (Notification != null) Notification(data); } public event NotificationHandler Notification; }
  • 15. Събития • Използване на събития – Не се допуска директно присвояване на стойност на събитието – Закачане (абониране) за събитие – с оператора += – Откачане от събитие – с оператора -= – Преди да предизвикаме събитието, проверяваме дали е различно от null – Ако събитието е декларирано с тяло, не изпълняваме събитието, а полето, което съхранява списъка с делегатни инстанции
  • 16. Събития delegate void NotificationHandler(object data); class Notifier { public void Notify(object data) { if (Notification != null) Notification(data); } public event NotificationHandler Notification; } class Program { static void Main(string[] args) { Notifier notifier = new Notifier(); notifier.Notification += new NotificationHandler(Notifier_Notification); notifier.Notify(42); Console.ReadLine(); } public static void Notifier_Notification(object data) { Console.WriteLine("Received notification with data: {0}", data); } }
  • 17. Събития • Приложение на събитията – Взаимодействия между обекти – Програмиране, базирано на събития – Приложения с графичен потребителски интерфейс
  • 18. Ламбда функции • Какво е „ламбда функция“? – Специален синтаксис за създаване на делегатна инстанция – Може да се декларира директно в тялото на друг метод или дори на друга ламбда функция – Параметри и тяло; тип на връщания резултат – Може да използва локалните променливи на метода, в който е декларирана
  • 19. Ламбда функции • Деклариране на ламбда функции – Параметър или списък от параметри (без декларирани типове) – Оператор => – Израз или блок – Типа на резултата се определя от типа на израза, или от типа на аргумента на return в тялото
  • 20. Ламбда функции delegate int BinaryOperation(int x, int y); class Calculator { public int Calculate(int x, int y, BinaryOperation operation) { return operation(x, y); } } class Program { static void Main(string[] args) { Calculator calculator = new Calculator(); int result = calculator.Calculate(3, 5, (x, y) => x + y); Console.WriteLine(result); Console.ReadLine(); } }
  • 21. Ламбда функции delegate void NotificationHandler(object data); class Notifier { public void Notify(object data) { if (Notification != null) Notification(data); } public event NotificationHandler Notification; } class Program { static void Main(string[] args) { Notifier notifier = new Notifier(); notifier.Notification += data => { Console.WriteLine("Received notification with data: {0}", data); }; notifier.Notify(42); Console.ReadLine(); } }
  • 22. Ламбда функции • Приложение на ламбда функциите – Кратък запис на делегатна инстанция – Подходящо, ако делегатната инстанция ще се ползва само на едно място в кода – Нужно, когато делегатната инстанция трябва да достъпва локални променливи на метода, в който е декларирана – Сходство с функционалното програмиране – По-четим код
  • 24. Благодаря! • Александър Далемски – – – – sasho@david.bg musashi.bg@gmail.com Skype: musasho https://www.facebook.com/adalemski • ДАВИД академия – – – – acad@david.bg http://acad.david.bg/ @david_academy https://www.facebook.com/groups/david.academy/