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

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

class Car : Vehicle
{
public override voi...
Къде е проблемът в кода?
class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
public class ...
Къде е грешката в кода?
interface INamedObject
{
string Name { get; }
}
interface IPet : INamedObject
{
int Age { get; }
b...
Делегати
• Какво е „делегат“?
– Тип данни
– Множеството от стойности са функциите с конкретен
брой и тип параметри и тип н...
Делегати
• Деклариране на делегати
–
–
–
–

Ключова дума delegate
Тип на връщания резултат
Наименование – идентификатор в ...
Делегати
• Използване на делегати
– Могат да бъдат използвани навсякъде, както
останалите типове данни
– Автоматично генер...
Делегати
delegate int BinaryOperation(int x, int y);
class Calculator
{
public int Calculate(int x, int y, BinaryOperation...
Делегати
• Използване на делегати
– Може конструирането на делегатна инстанция да се
замести директно с обръщение към мето...
Делегати
• Приложение на делегатите
– Изпълнение на различни операции (определяни по
време на изпълнение) върху еднотипни ...
Събития
• Какво е „събитие“?
– Член на клас, структура или интерфейс
– Служи за реализиране на взаимодействия между
обекти...
Събития
• Деклариране на събития
Ключова дума event
Тип на делегата
Наименование
Опционално: тяло с add и remove блокове, ...
Събития
delegate void NotificationHandler(object data);
class Notifier
{
public void Notify(object data)
{
if (Notificatio...
Събития
• Използване на събития
– Не се допуска директно присвояване на стойност на
събитието
– Закачане (абониране) за съ...
Събития
delegate void NotificationHandler(object data);
class Notifier
{
public void Notify(object data)
{
if (Notificatio...
Събития
• Приложение на събитията
– Взаимодействия между обекти
– Програмиране, базирано на събития
– Приложения с графиче...
Ламбда функции
• Какво е „ламбда функция“?
– Специален синтаксис за създаване на делегатна
инстанция
– Може да се декларир...
Ламбда функции
• Деклариране на ламбда функции
– Параметър или списък от параметри (без
декларирани типове)
– Оператор =>
...
Ламбда функции
delegate int BinaryOperation(int x, int y);
class Calculator
{
public int Calculate(int x, int y, BinaryOpe...
Ламбда функции
delegate void NotificationHandler(object data);
class Notifier
{
public void Notify(object data)
{
if (Noti...
Ламбда функции
• Приложение на ламбда функциите
– Кратък запис на делегатна инстанция
– Подходящо, ако делегатната инстанц...
Въпроси?
Благодаря!
• Александър Далемски
–
–
–
–

sasho@david.bg
musashi.bg@gmail.com
Skype: musasho
https://www.facebook.com/adal...
Upcoming SlideShare
Loading in …5
×

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

750 views
608 views

Published on

Занятие №9 на курса по програмиране на C# 2013 провеждан от ДАВИД академия в ПМГ "Никола Обрешков" - Казанлък. Включва темите:
- Делегати
- Събития
- Ламбда функции

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
750
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Курс по програмиране на C# Занятие №9 Делегати. Събития. Ламбда функции 2013
  2. 2. Съдържание 1/1 • Делегати • Събития • Ламбда функции
  3. 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. 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. 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. 6. Делегати • Какво е „делегат“? – Тип данни – Множеството от стойности са функциите с конкретен брой и тип параметри и тип на резултата – Служи за съхраняване и предаване на функции като данни – В C# наследява класа System.MulticastDelegate
  7. 7. Делегати • Деклариране на делегати – – – – Ключова дума delegate Тип на връщания резултат Наименование – идентификатор в Pascal case Списък от параметри delegate int BinaryOperation(int x, int y); delegate void Action(); delegate T Transformation<T>(T param);
  8. 8. Делегати • Използване на делегати – Могат да бъдат използвани навсякъде, както останалите типове данни – Автоматично генериран конструктор с един параметър – В аргумента на конструктора се поставя обръщение към метод без кръгли скоби с аргументи; методът трябва да бъде със съответстващи на делегата параметри и тип на резултата – Функцията, към която сочи делегатната инстанция, може да бъде изпълнена, като се поставят аргументи в скоби след наименованието на променливата
  9. 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. 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. 11. Делегати • Приложение на делегатите – Изпълнение на различни операции (определяни по време на изпълнение) върху еднотипни данни – Реализиране на взаимодействие между обекти чрез събития – Функции от по-висок ред – доближават C# до функционалното програмиране
  12. 12. Събития • Какво е „събитие“? – Член на клас, структура или интерфейс – Служи за реализиране на взаимодействия между обекти – Тип на делегат и наименование – Уникалност на наименованията – Много делегатни инстанции могат да бъдат закачени към едно събитие – При предизвикването на събитието се изпълняват последователно функциите във всички закачени делегатни инстанции
  13. 13. Събития • Деклариране на събития Ключова дума event Тип на делегата Наименование Опционално: тяло с add и remove блокове, които вътрешно закачат/откачат подадения параметър към/от поле със същия тип – Ако тялото е пропуснато, компилаторът създава вътрешно поле, в което да съхранява списъка от закачени делегатни инстанции (автоматично генерирано събитие) – – – –
  14. 14. Събития delegate void NotificationHandler(object data); class Notifier { public void Notify(object data) { if (Notification != null) Notification(data); } public event NotificationHandler Notification; }
  15. 15. Събития • Използване на събития – Не се допуска директно присвояване на стойност на събитието – Закачане (абониране) за събитие – с оператора += – Откачане от събитие – с оператора -= – Преди да предизвикаме събитието, проверяваме дали е различно от null – Ако събитието е декларирано с тяло, не изпълняваме събитието, а полето, което съхранява списъка с делегатни инстанции
  16. 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. 17. Събития • Приложение на събитията – Взаимодействия между обекти – Програмиране, базирано на събития – Приложения с графичен потребителски интерфейс
  18. 18. Ламбда функции • Какво е „ламбда функция“? – Специален синтаксис за създаване на делегатна инстанция – Може да се декларира директно в тялото на друг метод или дори на друга ламбда функция – Параметри и тяло; тип на връщания резултат – Може да използва локалните променливи на метода, в който е декларирана
  19. 19. Ламбда функции • Деклариране на ламбда функции – Параметър или списък от параметри (без декларирани типове) – Оператор => – Израз или блок – Типа на резултата се определя от типа на израза, или от типа на аргумента на return в тялото
  20. 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. 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. 22. Ламбда функции • Приложение на ламбда функциите – Кратък запис на делегатна инстанция – Подходящо, ако делегатната инстанция ще се ползва само на едно място в кода – Нужно, когато делегатната инстанция трябва да достъпва локални променливи на метода, в който е декларирана – Сходство с функционалното програмиране – По-четим код
  23. 23. Въпроси?
  24. 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/

×