SlideShare a Scribd company logo
eleks.comeleks.com
Advanced C#. Part 3
Exception Handling, AOP
• Повинні наслідуватись від System.Exception
• Стандартна обробка помилок в C#
• Викидається коли:
a) код досягає виразу throw
b) виникає системний вийняток (такий як ділення на нуль)
• Не перевіряються вийнятки чи їх специфікації
Вийнятки (Exceptions) в C#
• Потрібно викинути екземпляр виключення:
throw(new MyException(“Error”));
• Може бути використана тільки в блоці catch
catch
{
throw;
}
throw statement
• Наслідуємо від System.Exception або дочірного класу
public class Exception1 : System.Exception
{
public Exception1(string message) : base(message){}
}
public class SomeException : Exception1
{
public SomeException(string message) : base(message){}
}
Створення класу Exception
• Колись вийнятки, визначені у додатку повинні були розширювати
(наслідуватись від ) System.ApplicationException (obsolete)
ApplicationException(obsolete)
• Блок catch пов’язаний з блоком try
• Блок try може мати більше ніж один блок catch
• catch блок відловлює тип вийнятку або наслідуваний тип вийнятку
що проходять через:
блоки catch проглядаються в порядку їх появи в коді
блоки catch для специфічних типів повинні іти перед більш
загальними типами
• Порожній блок catch буде виловлювати всі типи
• Блок catch не потребує імені змінної
catch(Exception)
Виловлення вийнятків
Блоки catch
Невірно
void function1()
{
try
{
// code
}
catch(Exception ex)
{
}
catch(Exception1 ex)
{
}
}
Вірно
void function1()
{
try
{
// code
}
catch(Exception1 ex)
{
}
catch(Exception ex)
{
}
// if no rethrow occurs
// execution resumes here
}
• Вийняток передається вгору поки він не знайде прийнятний
обробник
void function1()
{
try
{
try
{
throw(new SomeOtherException(“Error Message”));
}
catch(Exception1 ex)
{
}
}
catch(Exception2 ex)
{
}
}
Exception Flow Control
• Якщо не буде знайдено підходящого обробника, то вийняток буде
переданий до методу, що викликається
void function2()
{
try
{
Function1();
}
catch(Exception3 ex3)
{
}
catch(Exception2 ex4)
{
}
catch(Exception ex)
{
}
}
Exception Flow Control
• Якщо не буде знайдено підходящого обробника, то виконання
програми перерветься і контроль буде передано операційній
системі (Windows)
Unhandled Exceptions
• Повинен бути повязаним з try блоком
• try блок може мати тільки один finally блок
• finally блок завжди виконується (але спочатку
виконується відповідний блок catch)
Блок finally
void function1()
{
try
{
try
{
throw(new SomeException(“Error Message”));
}
catch(Exception1 ex)
{
}
finally
{
}
}
catch(Exception2 ex)
{
}
finally
{
}
}
finally Flow Control
•Unhandeled exception в деструкторі
деструктор припиняє виконання, вийняток
нехтується, викликається базовий деструктор
•Catch без параметрів відловить усі
неопрацьовані вийнятки з інших мов
Деякі спеціальні правила
• ArithmeticException
• ArrayTypeMismatchException
• DivideByZeroException
• IndexOutOfRangeException
• InvalidCastException
• NullReferenceException
• OutOfMemoryException
• OverflowException
• StackOverflowException
• TypeInitializationException
Бібіліотека вийнятків
• Message –
Повідомлення (string) асоційоване з вийнятком
• InnerException
Якщо вийняток був згенерований всередині обробника вийнятків, це посилає на
оригінальний вийняток
• Source
Посилається на клас – джерело вийнятку
• StackTrace
Текстовий рядок, який представляє стек виклику, файл і номер рядка
System.Exception Class
eleks.com
Демонстрація 1
• Робота з вийнятками. Деббагінг
• Структурний шаблон проектування, призначений для динамічного підключення
додаткових можливостей до обєкта.
• Шаблон Decorator надає гнучку альтернативу методу визначення підкласів з метою
розширення функціональності.
Паттерн Декоратор
• Завдання
Об'єкт, який передбачається використовувати, виконує основні функції.
Проте може виникнути потреба додати до нього деяку додаткову
функціональність, яка виконуватиметься до або після основної
функціональності об'єкта.
• Спосіб вирішення:
Декоратор передбачає розширення функціональності об'єкта без
визначення підкласів.
• Реалізація
Створюється абстрактний клас, що представляє як початковий клас, так і
нові функції, що додаються в клас. У класах-декораторах нові функції
викликаються в необхідній послідовності — до або після виклику
подальшого об'єкта.
Паттерн Декоратор
Паттерн Декоратор
• Component: абстрактний клас, який визначає інтерфейс для наслідуваних обєктів
• ConcreteComponent: конкретна реалізація компонента, в яку з допомогою
декоратора добавляється нова функціональність
• Decorator: сам декоратор, реалізується в вигляді абстрактного класу і має той ж
базовий клас, що й обєкти що декоруються. Тому базовий клас Component повинен
бути легким і визначати тільки базовий інтерфейс. Клас декоратор також зберігає
посилання на обєкт що декорується в вигляді базового класу Componentі реалізує
звязок з базовим класм через наслідування
• ConcreteDecorstorA і ConcreteDecoratorB надають додатковий функціональності,
якими повинен бути розширений обєкт ConcreteComponent. ConcreteDecorstorA
добавляє нову властивість NewState, а ConcreteDecoratorB добавляє новий метод
NewMethod().
Паттерн Декоратор. Учасники
Розглянемо приклад.
Припустимо, у нас є піцерія, яка готує різні типи піц з різними добавками.
Є італійська, болгарська піци.
До них можуть додаватися помідори, сир і т.д.
І в залежності від типу піц і комбінацій добавок піца може мати різну вартість.
Тепер подивимося, як це зобразити в програмі на C #:
Паттерн Декоратор
eleks.com
Демонстрація 2
• Decorator Pattern
• Парадигма програмування, яка дозволяє виокремити перехресну (наскрізну)
функціональність.
• Часто згадуваним недоліком обєктно-орієнтовного підходу є неможливість локалізації
наскрізної функціональності в одному класі. Як приклад такої функціональності часто
називають необхідність ведення журналів подій, керування винятковими ситуаціями, перевірку
прав доступу. Код, що відповідає за дану функціональність, часто розкиданий по різних класах.
Це, з одного боку, не дозволяє сконцентрувати увагу на основній бізнес-логіці класу і
ускладнює читання коду. З іншого боку, ускладнюється внесення змін у методи роботи
наскрізної функціональності, що не завжди можна виправити правильним використанням
інтерфейсів чи шаблонів проектування.
Aspect Oriented Programming
• Аспект ( aspect) — модуль або клас, який реалізує наскрізну функціональність. Аспект змінює
поведінку іншого коду, застосовуючи поради в точках з'єднання, визначених деяким зрізом;
• Порада (advice) — додаткова логіка, код, який повинен бути викликаний з точки з'єднання.
Порада може бути виконана до, після або замість точки з'єднання;
• Ціль ( target) — об'єкт, до якого будуть застосовуватися поради;
• Точка з'єднання (join point) — точка в виконуваній програмі (виклик методу, створення об'єкта,
звернення до змінної), де слід застосувати пораду;
• Зріз (pointcut) — набір точок з'єднання. Зріз визначає, чи підходить дана точка з'єднання до
заданої поради;
• Впровадження (introduction) — зміна структури класу та/або зміна ієрархії успадкування для
додавання функціональності аспекту в чужорідний код;
• Переплетення ( weaving) — зв'язування об'єктів з відповідними аспектами (можливе на етапі
компіляції, завантаження або виконання програми).
Основні поняття
Переваги використання
• Аспектно-орієнтований підхід розглядає програмну систему як набір модулів,
кожен з яких виражає особливість функціонування системи.
• При проектуванні системи розробник вибирає модулі так, щоб кожен із них
реалізовував певну функціональну вимогу.
• Аспектно-орієнтований підхід зменшує складність розроблюваного коду
Переваги використання
• Аспектно-орієнтований підхід розглядає програмну систему як набір модулів,
кожен з яких виражає особливість функціонування системи.
• При проектуванні системи розробник вибирає модулі так, щоб кожен із них
реалізовував певну функціональну вимогу.
• Аспектно-орієнтований підхід зменшує складність розроблюваного коду
• АОП обробляє аспекти, як фреймворки компонентів. Він використовує щось, що називають
аспектною обгорткою, щоб вставити наші аспект-методи в наші класи під час компіляції.
• Проте, C # приходить з обгорткою аспекта аспектом.
• C # є гібридом процедурної та об'єктно-орієнтовної мов програмування.
• Таким чином, ми повинні наслідувати АОП з використанням комбінації спеціальних класів,
просторів імен і інтерфейсів.
Aspect Oriented Programming С#
• Ми повинні наслідувати наші АОП класи з ContextBoundClass.
• Клас ContextBoundClass дозволяє нам створювати компоненти АОП, через змогу розширення
.Net Framework для надання метаданих для наших компонентів.
public class ContextClass: ContextBoundObject { }
• Ми додаємо наші метадані до цього класу, де ми повинні реалізувати наші методи аспект.
• В C #, ми створюємо наші аспект модулі як класи атрибутів.
ContextBoundClass
• Як бачите нижче, наші класи атрибутів матимуть свої власні атрибути. У нашому прикладі
атрибут AttributeTarget контролює застосування атрибута класу / методу / властивості і так далі.
ContextBoundClass
eleks.com
Демонстрація 2
• Замикання (англ. Closure) - це процедура, яка посилається на вільні змінні в своєму лексичному
контексті.
• Замикання, так само як і екземпляр об'єкта, є спосіб представлення функціональності та даних,
пов'язаних і упакованих разом.
• Замикання (closures) представляють собою фрагменти (блоки) коду, який можна
використовувати в якості аргументів функцій і методів
• Ідея замикань полягає в доступі анонімного методу не тільки до переданих параметрів, а й до
зовнішнього оточення.
Замикання (Closures)
Замикання (Closures)
private void EnclosingMethod(bool outerVariable1,
ref int nonOuterVariable)
{
int outerVariable2 = 10;
string capturedVariable = "captured";
if (outerVariable2 % 2 == 0)
{
int normalLocalVariable = 5;
Console.WriteLine("Normal local variable: {0}", normalLocalVariable);
}
WaitCallback d = delegate(object o)
{
int anonymousMethodLocalVariable = 12;
Console.WriteLine("Captured variable is {0}", capturedVariable);
};
ThreadPool.QueueUserWorkItem(d, null);
}
Поведінка зохоплених змінних
Ще однією важливою особливістю реалізації замикань в
мові C # є те, що при замиканні здійснюється
захоплення змінної, а не захоплення значення змінної,
яке було перед визначенням делегата.
Поведінка зохоплених змінних
var funcs = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{
funcs.Add(() => i);
}
foreach (var f in funcs)
Console.WriteLine(f());
var funcs = new List<Func<int>>();
for (int i = 0; i < 3; ++i)
{
int tmp = i;
funcs.Add(() => tmp);
}
foreach (var f in funcs)
Console.WriteLine(f());
eleks.com
Демонстрація 4
Замикання 1
eleks.com
Демонстрація 4
Замикання 2
© Denys Prylutskyi, 2015
Практичне завдання
Рекомендована література
1. R. Sedgewick “Algorithms”
2. A. Troelsen “C# 6.0 and the .NET 4.6 Framework”
3. H. Schildt “C# 4.0 The Complete Reference”
4. J. Richter “CLR via C#”
5. J. Skeet “C# in Depth”
6. Stackoverflow.com

More Related Content

PPTX
.NET Platform. C# Basics
PPTX
Version control
PPTX
12 Architecture
PPTX
08 Exceptions and AOP
PPTX
PPTX
Angular. presentation
PPTX
Aspnet core
PPTX
Advanced styles
.NET Platform. C# Basics
Version control
12 Architecture
08 Exceptions and AOP
Angular. presentation
Aspnet core
Advanced styles

What's hot (20)

PPTX
10 asp.net
PPTX
PPTX
07 Database Access
PPTX
Windows service
PPTX
G rpc lection1_theory_bkp2
PDF
iPhone Objective-C Development (ukr) (2009)
PPTX
Advanced C#. Part 2
PPTX
System programing module 1. Processes
PPTX
System programing module 2. Threads
PPTX
Web service lecture
PPTX
NET Framework and C# Module 5. Interfaces
PDF
лаб. роб. №2 обєкти та сервіси що ними надаються
PPTX
Design patterns part 1
PDF
Xdebug (ukr)
PPTX
Net framework and C# module 17. Serialization
PPTX
11 web services
PPTX
Design patterns part 2
PPTX
Net Framework and c# module 2. OOP
PPTX
01 c# basics
PPTX
NET Framework and C# Module 6.2. Generics
10 asp.net
07 Database Access
Windows service
G rpc lection1_theory_bkp2
iPhone Objective-C Development (ukr) (2009)
Advanced C#. Part 2
System programing module 1. Processes
System programing module 2. Threads
Web service lecture
NET Framework and C# Module 5. Interfaces
лаб. роб. №2 обєкти та сервіси що ними надаються
Design patterns part 1
Xdebug (ukr)
Net framework and C# module 17. Serialization
11 web services
Design patterns part 2
Net Framework and c# module 2. OOP
01 c# basics
NET Framework and C# Module 6.2. Generics
Ad

Viewers also liked (20)

PPTX
SDLC. PM Role
PPTX
#2 integration + ui tests
PPTX
If unit2 summary
PPTX
SDLC. QA Role
PPTX
Frontend basics
PPTX
Design patterns
PPTX
Code Practices
PPTX
SQL Grouping, Joins
PPTX
tsql
PPTX
#4 code quality
PPTX
Mvvw patterns
PPTX
SQL: Indexes, Select operator
PPTX
Improving rpc bkp
PPTX
Sql 04n edited
PPTX
Unit1 summary
PPTX
Communication in android
PPTX
Css animation, html5 api
PPTX
NoSQL basics
PPTX
Lecture android best practices
PPTX
Solid and ioc principles
SDLC. PM Role
#2 integration + ui tests
If unit2 summary
SDLC. QA Role
Frontend basics
Design patterns
Code Practices
SQL Grouping, Joins
tsql
#4 code quality
Mvvw patterns
SQL: Indexes, Select operator
Improving rpc bkp
Sql 04n edited
Unit1 summary
Communication in android
Css animation, html5 api
NoSQL basics
Lecture android best practices
Solid and ioc principles
Ad

Similar to Advanced c sharp part 3 (20)

PPTX
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
PPT
V24 com to_net
PPTX
cpp-2013 #20 Best practices
PPT
Using Metatags in Flex Developing
PDF
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
PPTX
PDF
"Elements of functional programming in C# based on Language-Ext library as an...
PPTX
Net framework і c# module 9
PPTX
PPTX
ASP.NET Core лекція 02.pptx
PPTX
Automated testing
PPT
Основи алгоритмізації та програмування. Лекція 1
PPTX
PPTX
Net framework і c# module 5
PPTX
Лекція №12 Передача параметрів у функцію.pptx
PPTX
Лекція-Git-репозиторій-робота-з-гілками.pptx
PDF
C# OOP exception
PDF
Lecture 06. iOS Programming. Основи Objective-C
PPT
Uml+Patterns2
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
V24 com to_net
cpp-2013 #20 Best practices
Using Metatags in Flex Developing
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
"Elements of functional programming in C# based on Language-Ext library as an...
Net framework і c# module 9
ASP.NET Core лекція 02.pptx
Automated testing
Основи алгоритмізації та програмування. Лекція 1
Net framework і c# module 5
Лекція №12 Передача параметрів у функцію.pptx
Лекція-Git-репозиторій-робота-з-гілками.pptx
C# OOP exception
Lecture 06. iOS Programming. Основи Objective-C
Uml+Patterns2

More from eleksdev (8)

PPTX
Hello android world
PPTX
Android location and sensors API
PPTX
Lecture java basics
PPTX
G rpc lection1
PPTX
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
PPTX
SDLC. UX Role
PPTX
SDLC. BA Role
PPTX
sql introduction
Hello android world
Android location and sensors API
Lecture java basics
G rpc lection1
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
SDLC. UX Role
SDLC. BA Role
sql introduction

Advanced c sharp part 3

  • 1. eleks.comeleks.com Advanced C#. Part 3 Exception Handling, AOP
  • 2. • Повинні наслідуватись від System.Exception • Стандартна обробка помилок в C# • Викидається коли: a) код досягає виразу throw b) виникає системний вийняток (такий як ділення на нуль) • Не перевіряються вийнятки чи їх специфікації Вийнятки (Exceptions) в C#
  • 3. • Потрібно викинути екземпляр виключення: throw(new MyException(“Error”)); • Може бути використана тільки в блоці catch catch { throw; } throw statement
  • 4. • Наслідуємо від System.Exception або дочірного класу public class Exception1 : System.Exception { public Exception1(string message) : base(message){} } public class SomeException : Exception1 { public SomeException(string message) : base(message){} } Створення класу Exception
  • 5. • Колись вийнятки, визначені у додатку повинні були розширювати (наслідуватись від ) System.ApplicationException (obsolete) ApplicationException(obsolete)
  • 6. • Блок catch пов’язаний з блоком try • Блок try може мати більше ніж один блок catch • catch блок відловлює тип вийнятку або наслідуваний тип вийнятку що проходять через: блоки catch проглядаються в порядку їх появи в коді блоки catch для специфічних типів повинні іти перед більш загальними типами • Порожній блок catch буде виловлювати всі типи • Блок catch не потребує імені змінної catch(Exception) Виловлення вийнятків
  • 7. Блоки catch Невірно void function1() { try { // code } catch(Exception ex) { } catch(Exception1 ex) { } } Вірно void function1() { try { // code } catch(Exception1 ex) { } catch(Exception ex) { } // if no rethrow occurs // execution resumes here }
  • 8. • Вийняток передається вгору поки він не знайде прийнятний обробник void function1() { try { try { throw(new SomeOtherException(“Error Message”)); } catch(Exception1 ex) { } } catch(Exception2 ex) { } } Exception Flow Control
  • 9. • Якщо не буде знайдено підходящого обробника, то вийняток буде переданий до методу, що викликається void function2() { try { Function1(); } catch(Exception3 ex3) { } catch(Exception2 ex4) { } catch(Exception ex) { } } Exception Flow Control
  • 10. • Якщо не буде знайдено підходящого обробника, то виконання програми перерветься і контроль буде передано операційній системі (Windows) Unhandled Exceptions
  • 11. • Повинен бути повязаним з try блоком • try блок може мати тільки один finally блок • finally блок завжди виконується (але спочатку виконується відповідний блок catch) Блок finally
  • 12. void function1() { try { try { throw(new SomeException(“Error Message”)); } catch(Exception1 ex) { } finally { } } catch(Exception2 ex) { } finally { } } finally Flow Control
  • 13. •Unhandeled exception в деструкторі деструктор припиняє виконання, вийняток нехтується, викликається базовий деструктор •Catch без параметрів відловить усі неопрацьовані вийнятки з інших мов Деякі спеціальні правила
  • 14. • ArithmeticException • ArrayTypeMismatchException • DivideByZeroException • IndexOutOfRangeException • InvalidCastException • NullReferenceException • OutOfMemoryException • OverflowException • StackOverflowException • TypeInitializationException Бібіліотека вийнятків
  • 15. • Message – Повідомлення (string) асоційоване з вийнятком • InnerException Якщо вийняток був згенерований всередині обробника вийнятків, це посилає на оригінальний вийняток • Source Посилається на клас – джерело вийнятку • StackTrace Текстовий рядок, який представляє стек виклику, файл і номер рядка System.Exception Class
  • 16. eleks.com Демонстрація 1 • Робота з вийнятками. Деббагінг
  • 17. • Структурний шаблон проектування, призначений для динамічного підключення додаткових можливостей до обєкта. • Шаблон Decorator надає гнучку альтернативу методу визначення підкласів з метою розширення функціональності. Паттерн Декоратор
  • 18. • Завдання Об'єкт, який передбачається використовувати, виконує основні функції. Проте може виникнути потреба додати до нього деяку додаткову функціональність, яка виконуватиметься до або після основної функціональності об'єкта. • Спосіб вирішення: Декоратор передбачає розширення функціональності об'єкта без визначення підкласів. • Реалізація Створюється абстрактний клас, що представляє як початковий клас, так і нові функції, що додаються в клас. У класах-декораторах нові функції викликаються в необхідній послідовності — до або після виклику подальшого об'єкта. Паттерн Декоратор
  • 20. • Component: абстрактний клас, який визначає інтерфейс для наслідуваних обєктів • ConcreteComponent: конкретна реалізація компонента, в яку з допомогою декоратора добавляється нова функціональність • Decorator: сам декоратор, реалізується в вигляді абстрактного класу і має той ж базовий клас, що й обєкти що декоруються. Тому базовий клас Component повинен бути легким і визначати тільки базовий інтерфейс. Клас декоратор також зберігає посилання на обєкт що декорується в вигляді базового класу Componentі реалізує звязок з базовим класм через наслідування • ConcreteDecorstorA і ConcreteDecoratorB надають додатковий функціональності, якими повинен бути розширений обєкт ConcreteComponent. ConcreteDecorstorA добавляє нову властивість NewState, а ConcreteDecoratorB добавляє новий метод NewMethod(). Паттерн Декоратор. Учасники
  • 21. Розглянемо приклад. Припустимо, у нас є піцерія, яка готує різні типи піц з різними добавками. Є італійська, болгарська піци. До них можуть додаватися помідори, сир і т.д. І в залежності від типу піц і комбінацій добавок піца може мати різну вартість. Тепер подивимося, як це зобразити в програмі на C #: Паттерн Декоратор
  • 23. • Парадигма програмування, яка дозволяє виокремити перехресну (наскрізну) функціональність. • Часто згадуваним недоліком обєктно-орієнтовного підходу є неможливість локалізації наскрізної функціональності в одному класі. Як приклад такої функціональності часто називають необхідність ведення журналів подій, керування винятковими ситуаціями, перевірку прав доступу. Код, що відповідає за дану функціональність, часто розкиданий по різних класах. Це, з одного боку, не дозволяє сконцентрувати увагу на основній бізнес-логіці класу і ускладнює читання коду. З іншого боку, ускладнюється внесення змін у методи роботи наскрізної функціональності, що не завжди можна виправити правильним використанням інтерфейсів чи шаблонів проектування. Aspect Oriented Programming
  • 24. • Аспект ( aspect) — модуль або клас, який реалізує наскрізну функціональність. Аспект змінює поведінку іншого коду, застосовуючи поради в точках з'єднання, визначених деяким зрізом; • Порада (advice) — додаткова логіка, код, який повинен бути викликаний з точки з'єднання. Порада може бути виконана до, після або замість точки з'єднання; • Ціль ( target) — об'єкт, до якого будуть застосовуватися поради; • Точка з'єднання (join point) — точка в виконуваній програмі (виклик методу, створення об'єкта, звернення до змінної), де слід застосувати пораду; • Зріз (pointcut) — набір точок з'єднання. Зріз визначає, чи підходить дана точка з'єднання до заданої поради; • Впровадження (introduction) — зміна структури класу та/або зміна ієрархії успадкування для додавання функціональності аспекту в чужорідний код; • Переплетення ( weaving) — зв'язування об'єктів з відповідними аспектами (можливе на етапі компіляції, завантаження або виконання програми). Основні поняття
  • 25. Переваги використання • Аспектно-орієнтований підхід розглядає програмну систему як набір модулів, кожен з яких виражає особливість функціонування системи. • При проектуванні системи розробник вибирає модулі так, щоб кожен із них реалізовував певну функціональну вимогу. • Аспектно-орієнтований підхід зменшує складність розроблюваного коду
  • 26. Переваги використання • Аспектно-орієнтований підхід розглядає програмну систему як набір модулів, кожен з яких виражає особливість функціонування системи. • При проектуванні системи розробник вибирає модулі так, щоб кожен із них реалізовував певну функціональну вимогу. • Аспектно-орієнтований підхід зменшує складність розроблюваного коду
  • 27. • АОП обробляє аспекти, як фреймворки компонентів. Він використовує щось, що називають аспектною обгорткою, щоб вставити наші аспект-методи в наші класи під час компіляції. • Проте, C # приходить з обгорткою аспекта аспектом. • C # є гібридом процедурної та об'єктно-орієнтовної мов програмування. • Таким чином, ми повинні наслідувати АОП з використанням комбінації спеціальних класів, просторів імен і інтерфейсів. Aspect Oriented Programming С#
  • 28. • Ми повинні наслідувати наші АОП класи з ContextBoundClass. • Клас ContextBoundClass дозволяє нам створювати компоненти АОП, через змогу розширення .Net Framework для надання метаданих для наших компонентів. public class ContextClass: ContextBoundObject { } • Ми додаємо наші метадані до цього класу, де ми повинні реалізувати наші методи аспект. • В C #, ми створюємо наші аспект модулі як класи атрибутів. ContextBoundClass
  • 29. • Як бачите нижче, наші класи атрибутів матимуть свої власні атрибути. У нашому прикладі атрибут AttributeTarget контролює застосування атрибута класу / методу / властивості і так далі. ContextBoundClass
  • 31. • Замикання (англ. Closure) - це процедура, яка посилається на вільні змінні в своєму лексичному контексті. • Замикання, так само як і екземпляр об'єкта, є спосіб представлення функціональності та даних, пов'язаних і упакованих разом. • Замикання (closures) представляють собою фрагменти (блоки) коду, який можна використовувати в якості аргументів функцій і методів • Ідея замикань полягає в доступі анонімного методу не тільки до переданих параметрів, а й до зовнішнього оточення. Замикання (Closures)
  • 32. Замикання (Closures) private void EnclosingMethod(bool outerVariable1, ref int nonOuterVariable) { int outerVariable2 = 10; string capturedVariable = "captured"; if (outerVariable2 % 2 == 0) { int normalLocalVariable = 5; Console.WriteLine("Normal local variable: {0}", normalLocalVariable); } WaitCallback d = delegate(object o) { int anonymousMethodLocalVariable = 12; Console.WriteLine("Captured variable is {0}", capturedVariable); }; ThreadPool.QueueUserWorkItem(d, null); }
  • 33. Поведінка зохоплених змінних Ще однією важливою особливістю реалізації замикань в мові C # є те, що при замиканні здійснюється захоплення змінної, а не захоплення значення змінної, яке було перед визначенням делегата.
  • 34. Поведінка зохоплених змінних var funcs = new List<Func<int>>(); for (int i = 0; i < 3; i++) { funcs.Add(() => i); } foreach (var f in funcs) Console.WriteLine(f()); var funcs = new List<Func<int>>(); for (int i = 0; i < 3; ++i) { int tmp = i; funcs.Add(() => tmp); } foreach (var f in funcs) Console.WriteLine(f());
  • 37. © Denys Prylutskyi, 2015 Практичне завдання
  • 38. Рекомендована література 1. R. Sedgewick “Algorithms” 2. A. Troelsen “C# 6.0 and the .NET 4.6 Framework” 3. H. Schildt “C# 4.0 The Complete Reference” 4. J. Richter “CLR via C#” 5. J. Skeet “C# in Depth” 6. Stackoverflow.com

Editor's Notes

  • #31: private static IEnumerable<int> GetFibonacciNumbers(int maxValue) { int previous = 0; int current = 1; while (true) { int next = current + previous; if (next <= maxValue) { previous = current; current = next; yield return next; } else { yield break; } } }
  • #36: private static IEnumerable<int> GetFibonacciNumbers(int maxValue) { int previous = 0; int current = 1; while (true) { int next = current + previous; if (next <= maxValue) { previous = current; current = next; yield return next; } else { yield break; } } }
  • #37: private static IEnumerable<int> GetFibonacciNumbers(int maxValue) { int previous = 0; int current = 1; while (true) { int next = current + previous; if (next <= maxValue) { previous = current; current = next; yield return next; } else { yield break; } } }