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)
Виловлення вийнятків
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
13. •Unhandeled exception в деструкторі
деструктор припиняє виконання, вийняток
нехтується, викликається базовий деструктор
•Catch без параметрів відловить усі
неопрацьовані вийнятки з інших мов
Деякі спеціальні правила
15. • Message –
Повідомлення (string) асоційоване з вийнятком
• InnerException
Якщо вийняток був згенерований всередині обробника вийнятків, це посилає на
оригінальний вийняток
• Source
Посилається на клас – джерело вийнятку
• StackTrace
Текстовий рядок, який представляє стек виклику, файл і номер рядка
System.Exception Class
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());
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
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;
}
}
}
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;
}
}
}
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;
}
}
}