Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Курс по програмиране на
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. Делегати. Събития. Ламбда функции

1,323 views

Published on

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

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

×