Лекция № 4 Короткий огляд мови C#
Перша програма на C#
Загальна структура програми на С# простір імен Клас А Змінні класу Методи класу: Локальні змінні … Клас В Змінні класу Методи класу: Метод Main 3
Простори імен Простір імен (namespace) – це спосіб організації системи типів в єдину групу. Повні імена класів: Demo. App. m 1 Demo. App. My. Classes. m 2 Demo. App. My. Classes. m 3
Різні класифікації типів даних Типи даних Прості Типи даних Структуровані Вбудовані Визначаютьс я користувачем Типи даних Статичні Динамічні 5
Система типів Типи-значення (value type) Прості типи (bool, char, int, float тощо), перерахування, структури Типи-посилання (reference type) Класи, рядки, масиви, делегати та інтерфейси
Вбудовані типи Назва Псевдонім Тип. NET Діапазон значень Опис Розмір, біт Булевий bool Boolean true, false Цілі типи sbyte SByte – 128 — 127 знакове 8 byte Byte 0 — 255 беззнакове 8 short Int 16 – 32768 — 32767 знакове 16 ushort UInt 16 0 — 65535 беззнакове 16 int Int 32 ≈(– 2109 — 2109) знакове 32 uint UInt 32 ≈(0 — 4109) беззнакове 32 long Int 64 ≈(– 91018 — 91018) знакове 64 ulong UInt 64 ≈(0— 181018) беззнакове 64 7
Вбудовані типи (2) Назва Псевдонім Тип. NET Діапазон значень Опис Розмір, біт Символьний char Char U+0000 — U+ffff символ Unicode 16 Single 1. 510 -45 — 3. 41038 7 цифр 32 Double 5. 010 -324 — 1. 710308 15 -16 цифр 64 128 Дійсні типи float double Фінансовий decimal Decimal 1. 010 -28 — 7. 91028 28 -29 цифр Рядки string String довжина обмежена об’ємом доступної пам’яті рядок символів Unicode object Object можно зберігати все, що завгодно загальний предок 8
Базовий клас System. Object Відкриті методи класу System. Object: Відкритий метод Опис bool Equals(object obj) перевіряє еквівалентність поточного об'єкта та об'єкта, переданого в якості аргументу System. Type Get. Type() повертає системний тип поточного об'єкта string To. String() повертає рядок, пов'язаний з об'єктом; для арифметичних типів повертається значення, перетворене в рядок int Get. Hash. Code() служить як хеш-функція у відповідних алгоритмах пошуку за ключем при зберіганні даних в хештаблицях
Поля та методи вбудованих типів • Кожен вбудований тип C# побудований на основі стандартного класу бібліотеки . NET, тому у вбудованих типів даних C# є методи і поля, за допомогою яких можна, наприклад, отримати: – double. Max. Value (або System. Double. Max. Value) — максимальне число типу double; – uint. Min. Value (или System. UInt 32. Min. Value) — мінімальне число типу uint. • У дійсних класів є елементи: – позитивна нескінченість Positive. Infinity; – негативна нескінченість Negative. Infinity; – «не є числом» : Na. N. 10
Змінні простих типів та їх ініціалізація Змінна — це іменована область пам'яті, призначена для зберігання даних певного типу. C# є строго типізованою мовою: усі змінні повинні бути визначені до їх першого використання. Загальний синтаксис визначення змінних вбудованих типів-значень: Тип_змінної им’я_змінної [=значення]; Приклади: Можна заборонити змінювати значення змінної, задавши при її описі ключове слово const, наприклад: Такі величини називають іменованими константами.
Область дії та час життя змінних • Змінні описуються всередині деякого блоку (класу, методу або блоку всередині методу) – Блок — це код, узятий у фігурні дужки. Основне призначення блоку — групування операторів. – Змінні, описані безпосередньо всередині класу, називаються полями класу. – Змінні, описані всередині методу класу, називаються локальними змінними. • Область дії змінної – область програми, де можна використовувати змінну. • Область дії змінної починається у точці її опису та продовжується до кінця блоку, всередині якого вона описана. • Час життя: змінні створюються при вході у їх область дії (блок) та знищуються при виході. 12
Вирази Вираз – правило обчислення значення. У виразі беруть участь операнди, об'єднані знаками операцій. Операндами виразу можуть бути константи, змінні і виклики функцій. Операції виконуються відповідно до пріоритетів. Для зміни порядку виконання операцій використовуються круглі дужки. • Результатом виразу завжди є значення певного типу, який визначається типами операндів. • Величини, що беруть участь у вираженні, повинні бути сумісних типів. • • • Приклади: t + Math. Sin(x)/2 * x – результат має дійсний тип a <= b + 2 – результат має логічний тип x > 0 && y < 0 – результат має логічний тип 13
Пріорітети операцій C# Категорія Знак операції Первинні (), [], ++, --, new, … Унарні ~, !, ++, --, -, … Мультиплікативні *, /, % Аддитивні +, - Зсуву <<, >> Відношення та перевірка типу <, >, is, as Перевірки на рівність ==, != Порозрядні логічні &, ^, | Умовні логічні &&, || Умовні ? : Присвоєння =, *=, /=, …
Тип результату виразу • Якщо операнди, що входять у вираз, одного типу, і операція для цього типу визначена, то результат виразу буде мати той же тип. • Якщо операнди різного типу та/або операція для цього типу не визначена, перед обчисленнями автоматично виконується перетворення типу за правилами, що забезпечує приведення більш коротких типів до більш довгих для збереження значущості і точності. • Автоматичне (неявне) перетворення можливе не завжди, а лише якщо при цьому не буде втрачено значущості. • Якщо неявного перетворення з одного типу в інший не існує, можна задати явне перетворення типу за допомогою операції (тип) х. 15
Неявні арифметичні перетворення типів у C# double decimal float long ulong int short sbyte uint ushort byte char 16
Перетворення вбудованих арифметичних типів-значень Розширююче перетворення – значення одного типу приводиться до значення іншого типу, яке має такий самий або більший розмір (з 32 -розрядного у 64 -розрядне). Звужуюче перетворення – значення одного типу перетвориться до значення іншого типу, яке має менший розмір (з 64 -розрядного у 32 -розрядне). Таке перетворення потенційно небезпечно втратою значення.
Перетворення з рядкового типу в арифметичний Класи бібліотеки FCL надають два способи явного виконання таких перетворень: • метод Parse; • методи класу Convert. Приклади: 18
Перетворення з арифметичного типу у тип string Перетворення у тип string завжди визначені, оскільки всі типи є нащадками базового класу object і успадковують метод To. String(), який для всіх підтипів арифметичного типу повертає рядок, що задає відповідне значення арифметичного типу. Метод To. String завжди потрібно викликати явно. Його можна опускати при виконанні операції конкатенації. Приклад: 19
Блок (складений оператор) Блок — це послідовність операторів, що розміщується всередині операторних дужок: { } Блок сприймається компілятором як один оператор і може використовуватися скрізь, де синтаксис вимагає одного оператора, а алгоритм – декількох. Блок може містити один оператор або бути порожнім. 20
Керуючі оператори C# • Умовний оператор if if ( вираз ) оператор_1; [else оператор_2; ] • Оператор вибору switch ( вираз ){ case константний_вираз_1: [ список_операторів_1 ] case константний_вираз_2: [ список_операторів_2 ] case константний_вираз_n: [ список_операторів_n ] [ default: оператори ] } • Оператор циклу з передумовою while ( вираз ) оператор; • Оператор циклу з постумовою do оператор while ( вираз ); • Цикл с параметром for ( ініціалізація; вираз; модифікації ) оператор;
Приклад: калькулятор на чотири дії 22
Цикл з передумовою y = t x xn xk 23
Цикл с постумовою 24
Цикл з параметром 25
Передача керування • оператор break — завершення виконання циклу, всередині якого він записаний; • оператор continue —перехід до наступної ітерації циклу; • оператор return — вихід з функції, всередині якої він записаний; return [ вираз ]; • оператор throw — генерирует исключительную ситуацию; • оператор goto — безумовна передача керування. goto мітка; У тілі тієї ж функції має знаходитись рівно одна конструкція виду: мітка: оператор; 26
Стандартні класи мови C#. Робота з рядками
Клас System. String та його методи Тип string, призначений для роботи з рядками символів в кодуванні Unicode, є вбудованим посилковим типом C#. Йому відповідає базовий клас System. String бібліотеки. NET. Створити рядок можна декількома способами: Для рядків визначені наступні операції: • присвоєння (=); • перевірка на рівність (==); • перевірка на нерівність (!=); • звернення по індексу ([]); • конкатенація рядків (+). 28
Деякі властивості і методи класу System. String Властивість або метод Опис Length Властивість. Дозволяє отримати кількість символів у рядку. Concat() Дозволяє з'єднати декілька рядків або змінних типу object. Compare. To() Дозволяє порівняти два рядки. Copy() Створює нову копію існуючого рядка. Insert() Дозволяє вставити один рядок всередину існуючого. Chars Дозволяє отримати символ, що знаходиться в певній позиції рядка. Replace() Замінює один символ рядка іншим. Split() Повертає масив рядків з елементами - підрядками основного рядка, між якими знаходяться символи-роздільники. Trim() Видаляє пропуски або набір заданих символів на початку і кінці основного рядка. To. Char. Array() Створює масив символів і вставляє в нього символи початкового рядка.
Приклад роботи з рядками
Клас String. Builder та його методи Використовуючи клас String. Builder можна уникнути створення копій рядків при їх обробці. Всі зміни, що вносяться до об'єкту даного класу, негайно відображаються в ньому, що ефективніше, ніж робота з копіями рядка. Деякі методи класу String. Builder: Метод Опис Append Додавання заданого рядка в кінець рядка об'єкту. Copy. To Копіювання символів заданого сегменту рядка в задані комірки масиву символів. Insert Додавання рядка в задану позицію рядка об'єкту. Remove Видалення заданої кількості символів з рядка об'єкту Replace Заміна заданого символу або рядка об'єкту на інший заданий символ або рядок. 31
Стандартні класи мови C#. Масиви
Визначення • Масив — це обмежена сукупність однотипних величин. Елементи масиву мають одне і те саме ім'я, а розрізняються за порядковим номером (індексом). • Масиви — це типи-посиланя, тобто розташовуються в динамічній області пам'яті (купі), тому створення масиву починається з виділення пам'яті під його елементи. • Елементами масиву можуть бути величини як типів-значень, так і типівпосилань (у тому числі масиви), наприклад: • Всім елементам при створенні масиву призначається значення за промовчанням: нулі для типів-значень та null для типів-посилань. 33
Розміщення масивів у пам’яті П’ять простих змінних: a b c d Масив з п’яти елементів типу-значення: a[0] a[1] a[2] a[3] e a[4] a Масив з п’яти елементів типу-посилання: a[0] a[1] a[2] a[3] a[4] a Значення Значення 34
Розмірність масива • Кількість елементів у масиві (розмірність) задається при виділенні пам'яті і не може бути змінена згодом. Вона може задаватися виразом: • Розмірність не є частиною типу масиву. • Елементи масиву нумеруються з нуля. Звернення до елемента масиву: w[4] або z[i]. • З елементом масиву можна робити все, що припустимо для змінних того ж типу. • При роботі з масивом автоматично виконується контроль виходу за його межі: якщо значення індексу виходить за межі масиву, генерується виключення Index. Out. Of. Range. Exception. 35
Дії з масивами • Масиви одного типу можна присвоювати один одному. При цьому відбувається присвоєння посилань, а не елементів: • Всі інші дії виконуються з елементами масиву окремо: 36
Одновимірні масиви Варіанти опису масива: тип[] ім’я; тип[] ім’я = new тип [ размерность ]; тип[] ім’я = { список_ініціалізаторів }; тип[] ім’я = new тип [] { список_ініціалізаторів }; тип[] ім’я = new тип [ розмірність ] { список_ініціалізаторів }; Приклади: 37
Оператор foreach Застосовується для перебору елементів масива. Синтаксис: foreach ( тип имя in ім’я_масива ) тіло_циклу Ім’я задає локальну по відношенню до циклу змінну, яка буде по черзі приймати всі значення з масиву, наприклад: 38
Клас System. Array Всі масиви в C# мають спільний базовий клас Array, визначений у просторі імен System. Деякі елементи класу Array: – властивість Length – кількість елементів масиву (по всім розмірностям); – статичний метод Binary. Search – двійковий пошук у відсортованому масиві; – статичний метод Index. Of – пошук першого входження елемента в одномірний масив; – статичний метод Sort – впорядкування елементів одномірного масиву; – статичний метод Reverse – зміна порядку слідування елементів на зворотний. 39
Приклад використання методів класу Array та оператору foreach 40
Прямокутні масиви Прямокутний масив має більше одного виміру. Найчастіше в програмах використовуються двовимірні масиви. Варіанти опису двовимірного масиву: тип[, ] ім’я; тип[, ] ім’я = new тип [ розм_1, розм_2 ]; тип[, ] ім’я = { список_ініціалізаторів }; тип[, ] ім’я = new тип [, ] { список_ініціалізаторів }; тип[, ] ім’я = new тип [ розм_1, розм_2 ] { список_ініціалізаторів }; Приклади: 41
Прямокутні масиви До елементу двовимірного масиву звертаються, вказуючи номери рядка і стовпця, на перетині яких він розташований, наприклад: a[1, 4] або b[i, j]. Компілятор сприймає у якості номера рядка перший індекс, як би він не був позначений у програмі. 42
"Зубчасті“, ломані або ступінчасті (jagged) масиви У ступінчастих масивах кількість елементів в різних рядках може розрізнятися. У пам'яті ступінчастий масив зберігається у вигляді декількох внутрішніх масивів, кожен з яких має свій розмір. Крім того, виділяється окрема ділянка пам'яті для зберігання посилань на кожен з внутрішніх масивів: 43
Приклад ломаного масиву 44
Класи
Оголошення класу [ атрибути ] [ специфікатори ] class ім’я_класу [ : предки ] тіло_класу • Ім’я класу задається за загальними правилами. • Тіло класу — список описів його елементів, розташований у фігурних дужках. • Атрибути задають додаткову інформацію про клас. • Специфікатори визначають властивості класу, а також доступність класу для інших елементів програми. Приклад : class Demo {} 46
Специфікатори класу Специфікатор Опис new Використовується для вкладених класів. Задає новий опис класу замість успадкованого від предка. Застосовується в ієрархіях public Доступ не не обмежений protected Використовується для вкладених класів. Доступ лише з елементів даного та похідних класів internal Доступ лише з даної програми (збірки) protected internal Доступ лише з даного та похідних класів або з даної програми (збірки) private Використовується для вкладених класів. Доступ лише з елементів класу, всередині якого описаний даний клас abstract Абстрактний клас. Застосовується в ієрархіях sealed Бесплідний клас. Застосовується в ієрархіях static Статичний клас. Введений у версію мови 2. 0. 47
Приклад
Об’єкти • Клас є узагальненим поняттям, що визначає характеристики і поведінку безлічі конкретних об'єктів цього класу, званих екземплярами (об'єктами) класу. • Об'єкти створюються явним або неявним чином (програмістом або системою). Програміст створює екземпляр класу за допомогою операції new(): • Для кожного об'єкта при його створенні в пам'яті виділяється окрема область для зберігання його даних. • Крім того, у класі може містити статичні елементи, які існують в єдиному екземплярі для всіх об'єктів класу. • Функціональні елементи класу завжди зберігаються в єдиному екземплярі. 49
Данні: поля та константи • Дані, що містяться у класі, можуть бути змінними або константами. • Змінні, описані у класі, називаються полями класу. • При описі полів можна вказувати атрибути та специфікатори, що задають різні характеристики елементів: [ атрибути ] [ специфікатори ] [ const ] тип ім’я [ = початкове_значення ] • Всі поля спочатку автоматично ініціалізуються нулем відповідного типу (наприклад, полям типу int присвоюється 0, а посиланням на об'єкти – значення null). Після цього полю присвоюється значення, задане при його явній ініціалізації. 50
Специфікатори полей та констант класу Специфікатор Опис new Новий опис поля, що приховує успадкований элемент класса public Доступ до елементу не обмежений protected Доступ тільки з даного та похідних класів internal Доступ тільки з даної збірки protected internal Доступ тільки з даного і похідних класів і з даної збірки private Доступ тільки з даного класу static Поле належить класу в цілому, а не об’єктам даного класу readonly Поле може бути ініціалізованим тільки у конструкторі класу volatile Поле может бути зміненим іншим процесом або операційною системою 51
Приклад 52
Методи • Метод — функціональний элемент класу, що реализує обчислення або інші дії. Методи визначають поведінку класу та складають його інтерфейс. • Метод — завершений фрагмент коду, до якого можна звернутися за іменем. Він описується один раз, а викликатися може стільки, скільки це буде необхідно. • Один і той самий метод може обробляти різні дані, що передані йому в якості аргументів. Синтаксис методу: [атрибути] [специфікатори] тип ім’я_методу ( [ параметри ] ) тіло_методу • При описі методів можуть використовуватись модифікатори: virtual, sealed, override, abstract та extern. 53
Параметри методів • Параметри визначають можину значень аргументів, які можна передати в метод. • Перелік аргументів при виклику метода має відповідати переліку параметрів, тобто аргументи повинні мати типи, сумісні з типами відповідних параметрів. • Для кожного параметру мають бути заданими його тип, ім’я, і, можливо, вид параметру. • Ім’я метода разом з кількістю, типами і специфікаторами його параметрів складають сигнатуру методу. • В класі не може бути двох методів з однаковими сигнатурами. • Метод, описаний зі специфікатором static, може звертатися тільки до статичних полів класу, тобто до полів зі специфікатором static. • Статичний метод викликається через ім’я класу, а звичайний – через ім’я екземпляру класу. 54
Приклад 55
Виклик методу Під час виклику методу: 1. Обчислюються вирази, що стоять на місці аргументів. 2. Виділяється пам’ять під параметри методу. 3. Кожному з параметрів підставляється відповідний аргумент. При цьому перевіряється відповідність типів аргументів і параметрів та за необхідності виконується їх перетворення. 4. Виконується код (тіло) методу. 5. Якщо метод повертає значення, воно повертається у точку виклику; якщо метод має тип void, потік керування передається на інструкцію, що йде одразу після виклику. 56
Ілюстрація передачі параметрів Опис аргументів: int b; double a, c; Виклик методу: obj. P(a, b, c); Заголовок методу: public void P(double x, int y, double z); 57
Приклад передачі параметрів 58
Способи передачі параметрів та їх типи Способи передачі параметрів: за значенням і за посиланням. • При передачі за значенням метод отримує копії значень аргументів, і код метода працює з цими копіями. • При передачі за посиланням (за адресою) метод отримує копії адрес аргументів і працює з аргументами за цими адресами. Типи параметрів: • параметри-значення (без специфікатора); • параметри-посилання (ref); • вихідні параметри (out); • параметри-масивы (params). Ключове слово передує опису типу параметра. Якщо воно опущено, параметр вважається параметром-значенням. Приклад:
Приклад: параметри-значення та параметри-посилання 60
Ключове слово this Щоб забезпечити роботу методу з полями того об'єкта, для якого він був викликаний, в метод автоматично передається прихований параметр this, в якому зберігається посилання на функцію, що викликала об'єкт. У явному вигляді параметр this застосовується 61
Конструктори Конструктор – це спеціальний метод, який виділяє пам'ять під об'єкт і ініціалізує виділену область. Він викликається автоматично при створенні об'єкта класу за допомогою операції new. Ім'я конструктора збігається з ім'ям класу. Синтаксис конструктора: ім'я_класу(список_параметрів) {тіло_конструктора} Властивості конструкторів: • Конструктор не повертає значення (навіть типу void). • Клас може мати кілька конструкторів з різними параметрами для різних видів ініціалізації. • Синтаксис виклику конструктора им’я_класу им’я_об’єкту = new им’я_класу(); • Якщо програміст не вказав жодного конструктора або якісь поля не були ініціалізовані, полям типів-значень присвоюється нуль, полям типівпосилань – значення null. • Конструктор, що викликається без параметрів, називається конструктором за промовчанням. 62
Приклад класу з конструктором 63
Приклад класу з двома конструкторами 64
Приклад оголошення статичного класу
Властивості • Властивості служать для організації доступу до полів класу. Як правило, властивість визначає методи доступу до закритого поля. • Синтаксис властивості: [ атрибути ] [ специфікатори ] тип ім’я_властивості { [ get код_доступу ] [ set код_доступу ] } • Найчастіше властивості оголошуються як відкриті (public). • Код доступу являє собою блоки операторів, які виконуються при отриманні (get) або установці (set) властивості. Можуть бути відсутніми або частина get, або set, але не обидві одночасно. • Якщо відсутня частина set, властивість доступна лише для читання (readonly), якщо відсутня частина одержати, властивість доступна тільки для запису (write-only). 66
Приклад опису властивостей У програмі властивість виглядає як поле класу. При зверненні до властивості автоматично викликаються вказані у ній методи читання та налаштування. 67
Литература 1. 2. 3. Рихтер Дж. CLR via C#. Программирование на платформе Microsoft. NET Framework 4. 0 на языке C#. 3 -е изд. – СПб. : Питер, 2012. – 928 с. Кулямин В. В. Технологии программирования. Компонентный подход. – М. : ИНТУИТ-Бином, 2007. – 463 с. Зыков С. В. Введение в теорию программирования. Объектно-ориентированный подход – http: //www. intuit. ru/department/se/tppobj/17/. 68
Кінець Дякую за увагу
Примітивні типи (primitive types) Тип СТS Псевдонім С# Опис System. Object object Базовий клас для всіх типів CTS System. String string Рядок System. SByte sbyte 8 -розрядний байт зі знаком System. Byte byte 8 -розрядний байт без знаку System. Ы 16 short 16 -розрядне число зі знаком System. UM 16 ushort 16 -розрядне число без знаку System. Int 32 int 32 -розрядне число зі знаком System. UInt 32 uint 32 -розрядне число без знаку System. Int 64 long 64 -розрядне число зі знаком System. UInt 64 ulong 64 -розрядне число без знаку System. Char char 16 -розрядний символ Unicode System. Single float 32 -разрядне число с плавающей точкой стандарта IEEE System. Double double 64 -розрядне число з плаваючою крапкою стандарту IEEE System. Boolean bool Булеве значення (true/false) System. Decimal decimal 128 -розрядний тип даних
Бібліотека базових класів. NET Framework System. Data System. Drawing System. Windows. Forms System. Web. Services System. Web. UI System. Collections System. Diagnostics System. IO FCL (. NET Framework Class Library) – відповідна специфікації CLS об'єктно-орієнтована бібліотека класів, інтерфейсів і систем типів, які входять до складу платформи Microsoft. NET. FCL можуть використовувати УСІ . NET-застосування, незалежно від призначення, архітектури та використовуваної при розробці мови програмування. Всі класи знаходяться всередині ієрархічно вкладених просторів імен (namespaces). 71
Ієрархія основних просторів імен. Net Framework System Базовий простір System. Data Класи для роботи з базами даних System. Data. Common Загальні класи для роботи з базами даних System. Data. Ole. Db Класи для роботи з базами даних АССЕS та інших СКБД System. Data. Sql. Client Класи для роботи з базами даних SQL Server System. Collections Класи для роботи с контейнерами System. Diagnostics Класи для трасування и відлагодження коду System. Drawing Класи графіки System. IO Підтримка введення/виведення System. Net Підтримка передачі даних по мережах System. Reflection Робота с типами даних користувача при виконанні програми System. Runtime. Interop. Services System. Runtime. Remoting Підтримка взаємодій із "звичайним кодом" (некерованим) – DLL, COMсервери, віддалений доступ Підтримка розподілених обчислень System. Security Криптографія, прівілеї System. Threading Робота з потоками System. Web Робота с web-застосуваннями