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

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

Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14DAVID Academy
 
Presentation on SOLID design principles
Presentation on SOLID design principlesPresentation on SOLID design principles
Presentation on SOLID design principlesKostadin Golev
 
Курс по информационни технологии (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 SQLDAVID Academy
 
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №11DAVID Academy
 
Eclipse Editors@TUES (Part 2)
Eclipse Editors@TUES (Part 2)Eclipse Editors@TUES (Part 2)
Eclipse Editors@TUES (Part 2)Kiril Mitov
 
Демо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин НаковДемо урок по програмиране със Светлин Наков
Демо урок по програмиране със Светлин НаковSvetlin Nakov
 
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2DAVID Academy
 
AJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузърAJAX и създаване на богати потребителски интерфейси в браузър
AJAX и създаване на богати потребителски интерфейси в браузърsvilen.ivanov
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8DAVID Academy
 
8. vb sabitijno programirane
8. vb sabitijno programirane8. vb sabitijno programirane
8. vb sabitijno programiranednaidenowa
 
Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Информационни системи - упражнение № 2
Информационни системи - упражнение № 2Tsvetelin Pavlov
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13DAVID Academy
 
Svetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin Nakov - .NET Framework Overview
Svetlin Nakov - .NET Framework OverviewSvetlin 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

Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSDAVID Academy
 
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLDAVID Academy
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №12DAVID Academy
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10Училищен курс по програмиране на C# (2013/2014), занятие №10
Училищен курс по програмиране на C# (2013/2014), занятие №10DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №9DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №7DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3DAVID Academy
 
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesDAVID Academy
 
Курс по информационни технологии (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 FrameworkDAVID Academy
 
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...DAVID Academy
 
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...DAVID Academy
 
Курс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. ПредставянеКурс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. ПредставянеDAVID Academy
 
Курс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоКурс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - Помагало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/