SlideShare a Scribd company logo
Курс по програмиране на
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/

More Related Content

PPTX
Нийтийн номын сангийн цахим уншлагын үйлчилгээний өнөөгийн байдал
DOCX
Організація та проведення кваліфікаційних пробних робіт
PDF
5_Прикладна мікологія. Мікотоксини
PDF
9 klas mistectvo_masol_2017
PPTX
Oshas mns 18001
PPTX
ИРГЭНИЙ ХУУЛИЙН 12 ДУГААР ЗҮЙЛ. ӨӨРТӨӨ ТУСЛАХ ЗҮЙЛИЙН ТАЛААРХ ТАНИЛЦУУЛГА
PPTX
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
DOCX
Курс по програмиране на C# (2013) - Помагало
Нийтийн номын сангийн цахим уншлагын үйлчилгээний өнөөгийн байдал
Організація та проведення кваліфікаційних пробних робіт
5_Прикладна мікологія. Мікотоксини
9 klas mistectvo_masol_2017
Oshas mns 18001
ИРГЭНИЙ ХУУЛИЙН 12 ДУГААР ЗҮЙЛ. ӨӨРТӨӨ ТУСЛАХ ЗҮЙЛИЙН ТАЛААРХ ТАНИЛЦУУЛГА
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# (2013) - Помагало

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

PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №14
PPTX
.NET/C#_12
PPT
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №13
PDF
8. vb sabitijno programirane
PPTX
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
PPTX
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №7
DOC
7. vb sabitijno programirane
PPTX
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №12
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №11
PPTX
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
PPT
Introduction To Object Oriented Design and UML
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №1
PDF
Eclipse Editors@TUES (Part 2)
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №4
PPT
High Quality Code Introduction
PPT
Nakov High Quality Code
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №14
.NET/C#_12
Училищен курс по програмиране на C# (2013/2014), занятие №13
8. vb sabitijno programirane
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Училищен курс по програмиране на C# (2013/2014), занятие №7
7. vb sabitijno programirane
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Училищен курс по програмиране на C# (2013/2014), занятие №12
Училищен курс по програмиране на C# (2013/2014), занятие №11
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Introduction To Object Oriented Design and UML
Училищен курс по програмиране на C# (2013/2014), занятие №1
Eclipse Editors@TUES (Part 2)
Училищен курс по програмиране на C# (2013/2014), занятие №4
High Quality Code Introduction
Nakov High Quality Code
Училищен курс по програмиране на C# (2013/2014), занятие №8
Ad

More from DAVID Academy (20)

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

Курс по програмиране на 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/