- •Розділ 1. Основи платформи .Net
- •1.1. Основи платформи .Net
- •1.2. Загальні відомості об'єктно-орієнтованого програмування
- •1.3. Середовище Visual Studio .Net
- •1.4 Консольні додатки
- •Розділ 2. Основні поняття мови
- •2.1. Склад мови
- •2.1.1 Алфавіт і лексеми
- •2.1.2. Ідентифікатори і ключові слова
- •2.1.3. Знаки операцій і роздільники
- •2.1.4. Літерали
- •Константи в с#
- •Суфікси цілих і дійсних констант
- •Управляючі послідовності у с#
- •2.1.5. Коментарі
- •2.2. Типи даних
- •2.2.1. Класифікація типів
- •2.2.2. Типи літералів
- •2.2.3. Типи-значення і посилальні типи
- •2.2.4. Упаковка і розпаковування
- •2.3. Рекомендації по програмуванню
- •Розділ 3. Змінні, іменовані константи, операції і вирази
- •3.1. Змінні і іменовані константи
- •3.2. Операції і вирази
- •3.2.1. Перетворення вбудованих арифметичних типів-значень
- •3.2.2. Введення у виключення
- •3.2.3. Основні операції с#
- •Операнд_1 ? операнд_2 : операнд_3.
- •3.3. Лінійні програми (програмування лінійних обчислювальних процесів)
- •3.3.1. Просте введення-виведення даних
- •3.3.2. Математичні функції - клас Math
- •Розділ 4. Оператори
- •4.1. Вирази, блоки
- •4.2. Оператори розгалуження
- •4.2.1. Умовний оператор if
- •4.2.1. Умовний оператор switch
- •4.3. Оператори циклу
- •4.3.1. Цикл з передумовою while
- •4.3.2. Цикл з постумовою do
- •4.3.3. Цикл з параметром for
- •For ( ініціалізація; вираз; модифікації ) оператор;
- •4.3.4. Цикл перебору foreach
- •4.3.5. Рекомендації по вибору оператора циклу
- •4.4. Обробка виняткових ситуацій
- •4.4.1. Оператор try
- •Try блок [ блоки catch ] [ блок finally ]
- •4.4.2. Оператор throw
- •Throw [ вираз ];
- •4.4.3. Клас Exception
- •4.4.4. Оператори checked и unchecked
- •4.5. Рекомендації по програмуванню
- •Розділ 5. Класи: основні поняття
- •5.1. Привласнення і порівняння об'єктів
- •5.2. Дані: поля і константи
- •5.3. Методи
- •5.3.1. Параметри методів
- •5.3.2. Параметри-значення
- •5.3.3. Параметри-посилання
- •5.3.4. Вихідні параметри
- •5.4. Ключове слово this
- •5.5. Конструктори
- •5.6. Властивості
- •[ Атрибути ] [ специфікатори ] тип ім’я_властивості
- •[ Get код_доступа ] [ set код_доступа ]
- •5.7. Рекомендації по програмуванню
- •Розділ 6. Масиви і рядки
- •6.1. Одновимірні масиви
- •6.2. Прямокутні масиви
- •6.3. Ступінчасті масиви
- •6.4. Клас System.Array
- •6.5. Клас Random
- •6.6. Оператор foreach
- •6.7. Масиви об’єктів
- •6.8. Символи і рядки
- •6.8.1. Символи
- •6.8.2. Масиви символів
- •6.8.3. Рядки типу string
- •6.8.4. Форматування рядків
- •6.8.5. Рядки типу StringBuilder
- •6.9. Рекомендації з програмування
- •Розділ 7. Класи: подробиці
- •7.1. Перевантаження методів
- •7.2. Рекурсивні методи
- •7.3. Методи із змінною кількістю аргументів
- •7.4. Метод Main
- •7.5. Індексатори
- •7.6. Операції класу
- •7.6.1. Унарні операції
- •7.6.2. Бінарні операції
- •7.6.3. Операції перетворення типу
- •7.7. Деструктор
- •7.8. Вкладені типи
- •7.9. Рекомендації по програмуванню
- •Розділ 8. Ієрархії класів
- •8.1. Спадкоємство
- •8.2. Віртуальні методи
- •8.3. Абстрактні класи
- •8.4. Безплідні класи
- •8.5. Клас object
- •8.6. Рекомендації по програмуванню
- •Розділ 9. Інтерфейси і структурні типи
- •9.1. Синтаксис інтерфейсу
- •9.2. Реалізація інтерфейсу
- •9.3. Робота з об'єктами через інтерфейси. Операції is і as
- •9.4. Інтерфейси і спадкоємство
- •9.5. Стандартні інтерфейси .Net
- •9.5.1. Порівняння об'єктів (інтерфейс iComparable)
- •9.5.2 Сортування по різних критеріях (інтерфейс iComparer)
- •9.5.3 Перевантаження операцій відношення
- •9.5.4. Клонування об'єктів (інтерфейс iСloneable)
- •9.5.5. Перебір об'єктів (інтерфейс iEnumerable) і ітератори
- •9.6. Структури
- •9.7. Перелічення
- •9.7.1 Операції з переліченнями
- •9.7.2. Базовий клас System.Enum
- •9.8. Рекомендації по програмуванню
- •Розділ 10. Делегати, події і потоки виконання
- •10.1. Делегати
- •10.1.1. Опис делегатів
- •10.1.2. Використання делегатів
- •10.1.3. Патерн “спостерігач”
- •10.1.4. Операції
- •10.1.5. Передача делегатів в методи
- •10.1.6. Обробка виключень при виклику делегатів
- •10.3. Багатопотокові додатки
- •10.3.1. Клас Thread
- •Lock ( вираз ) блок_операторів
- •10.3.2. Асинхронні делегати
- •10.4. Рекомендації по програмуванню
- •Розділ 11. Робота з файлами
- •11.1. Потоки байтів
- •11.2. Асинхронне уведення-виведення
- •11.3. Потоки символів
- •11.4. Двійкові потоки
- •11.5. Консольне уведення-виведення
- •11.6. Робота з каталогами і файлами
- •11.7. Збереження об'єктів (серіалізація)
- •11.8. Рекомендації по програмуванню
- •Розділ 12. Збірки, бібліотеки, атрибути, директиви
- •12.2. Створення бібліотеки
- •12.3. Рефлексія
- •12.4. Атрибути
- •12.5. Простір імен
- •12.6. Директиви препроцесора
- •# Константний_вираз
- •[ #Elif константний_вираз
- •[ #Elif константний_вираз
- •Розділ 13. Структури даних, колекції і класи-прототипи
- •13.1. Абстрактні структури даних
- •13.2. Простір імен System.Collections
- •13.3. Клас ArrayList
- •13.4. Класи-прототипи
- •13.5. Створення класу-прототипу
- •13.6. Узагальнені методи
- •13.7. Часткові типи
- •13.8. Типи, що обнуляються
- •13.9. Рекомендації по програмуванню
- •Розділ 14. Додаткові засоби с#
- •14.1. Небезпечний код
- •Unsafe блок
- •14.1.1. Синтаксис вказівок
- •14.1.2. Перетворення та ініціалізація вказівок
- •14.1.3. Операції з вказівками
- •14.2. Регулярні вирази
- •14.2.1. Метасимволи
- •14.2.2. Класи бібліотеки .Net для роботи з регулярними виразами
- •14.3. Документування у форматі xml
- •Лабораторні роботи
- •Лабораторна робота 5. Одновимірні масиви
- •Лабораторна робота 6. Двовимірні масиви
- •Лабораторна робота 7. Рядки
- •Лабораторна робота 8. Класи і операції
- •Лабораторна робота 9. Спадкоємство
- •Лабораторна робота 10. Структури
- •Лабораторна робота 11. Інтерфейси і параметризовані колекції
- •Список літератури
- •Додатки Додаток 1. Специфікатори формату для рядків с#
10.4. Рекомендації по програмуванню
Делегати широко застосовуються в бібліотеці .NET як самостійно, так і для підтримки механізму подій.
Делегат є особливим видом класу, що нагадує собою інтерфейс, але, на відміну від нього, задає тільки одну сигнатуру методу. У мові C ++ аналогом делегата є вказівка на функцію, але вона не володіє безпекою і зручністю використання делегата. Завдяки делегатам стає можливою гнучка організація взаємодії, що дозволяє підтримувати узгоджений стан взаємозв'язаних об'єктів.
Основною метою створення багатопотокових застосувань є підвищення загальної продуктивності програми. Проте розробка багатопотокових застосувань складніша, оскільки при цьому виникають проблеми синхронізації даних, пов'язаних з можливістю доступу до одних і тих же даних з боку декількох потоків.
Розділ 11. Робота з файлами
Файл - іменована інформація на зовнішньому носієві, наприклад на жорсткому або гнучкому магнітному диску. Логічно файл можна представити як кінцева кількість послідовних байтів, тому такі пристрої, як дисплей, клавіатура і принтер, також можна розглядати як файли. Передача даних із зовнішнього пристрою в оперативну пам'ять називається читанням, або введенням, зворотний процес - записом, або виведенням.
Введення-виведення в С# виконується за допомогою підсистеми введення-виведення і класів бібліотеки .NET. У цьому розділі розглядається обмін даними з файлами і консоллю. Обмін даними реалізується за допомогою потоків.
Потік (stream) - це абстрактне поняття, що відноситься до будь-якого перенесення даних від джерела до приймача. Потоки забезпечують надійну роботу як із стандартними, так і з визначеними користувачем типами даних. Потік визначається як послідовність байтів і не залежить від конкретного пристрою, з яким проводиться обмін (оперативна пам'ять, файл на диску, клавіатура або принтер).
Обмін з потоком для підвищення швидкості передачі даних проводиться, як правило, через спеціальну область оперативної пам'яті - буфер. Буфер виділяється для кожного відкритого файлу. При записі у файл вся інформація спочатку прямує в буфер і там накопичується до тих пір, поки весь буфер не заповниться. Тільки після цього або після спеціальної команди скидання відбувається передача даних на зовнішній пристрій. При читанні з файлу дані спочатку прочитуються в буфер, причому не стільки, скільки запрошується, а скільки поміщається в буфер.
Механізм буферізації дозволяє швидше і ефективно обмінюватися інформацією із зовнішніми пристроями.
Для підтримки потоків бібліотека .NET містить ієрархію класів, основна частина якої представлена на рис. 11.1. Ці класи визначені в просторі імен System.IO. Окрім класів там описана велика кількість перелічень для завдання різних властивостей і режимів.
Класи бібліотеки дозволяють працювати в різних режимах з файлами, каталогами і областями оперативної пам'яті. Короткий опис класів приведений в таблиці 11.1.
Як можна бачити з таблиці, виконувати обмін із зовнішніми пристроями можна на рівні:
- двійкового представлення даних (BinaryReader, BinaryWriter);
- байтів (FileStream);
- тексту, тобто символів (StreamWriter, StreamReader).
У .NET використовується кодування Unicode, в якому кожен символ кодується двома байтами. Класи, що працюють з текстом, є оболонками класів, що використовують байти, і автоматично виконують те, що кодується з байтів в символи і назад.
Рис. 11.1. Класи бібліотеки .NET для роботи з потоками
Двійкові і байтові потоки зберігають дані в тому ж вигляді, в якому вони представлені в оперативній пам'яті, тобто при обміні з файлом відбувається побітове копіювання інформації. Двійкові файли застосовуються не для перегляду їх людиною, а для використання в програмах.
Доступ до файлів може бути послідовним, коли черговий елемент можна прочитати (записати) тільки після аналогічної операції з попереднім елементом, і довільним, або прямим, при якому виконується читання (запис) довільного елементу за заданою адресою. Текстові файли дозволяють виконувати тільки послідовний доступ, в двійкових і байтових потоках можна використовувати обидва методи.
Прямий доступ у поєднанні з відсутністю перетворень забезпечує високу швидкість отримання потрібної інформації.
Методи форматованого введення, за допомогою яких можна виконувати введення з клавіатури або з текстового файлу значень арифметичних типів, в С# не підтримуються. Для перетворення з символьного в числове представлення використовуються методи класу Convert або метод Parse, розглянуті в попередніх розділах.
Таблиця 11.1
Основні класи простору імен System.IO
Клас |
Опис |
BinaryReader, BinaryWriter |
Читання і запис значень простих вбудованих типів (цілочисельних, логічних, рядкових і т. п.) у внутрішній формі уявлення |
BufferedStream |
Тимчасове зберігання потоку байтів (наприклад, для подальшого перенесення в постійне сховище) |
Directory, Directorylnfo, File, Filelnfo |
Робота з каталогами або фізичними файлами: створення, видалення, придбання властивостей. Можливості класів File і Directory реалізовані в основному у вигляді статичних методів. Аналогічні класи DirectoryInfo і FileInfo використовують звичайні методи |
FileStream |
Довільний (прямий) доступ до файлу, представленого як потік байтів |
MemoryStream |
Довільний доступ до потоку байтів в оперативній пам'яті |
StreamWriter, StreamReader |
Читання з файлу і запис у файл текстової інформації (довільний доступ не підтримується) |
StringWriter, StringReader |
Робота з текстовою інформацією в оперативній пам'яті |
Форматоване виведення, тобто перетворення з внутрішньої форми представлення числа в символьну, зрозумілу людині, виконується за допомогою перевантажених методів ToString.
Окрім перерахованих класів в бібліотеці .NET є класи XmlTextReader і XmlTextWriter, призначені для формування і читання коду у форматі XML.
Розглянемо прості способи роботи з файловими потоками. Використання класів файлових потоків в програмі припускає наступні операції:
1. Створення потоку і зв’язування його з фізичним файлом.
2. Обмін (уведення-виведення).
3. Закриття файлу.
Кожен клас файлових потоків містить декілька варіантів конструкторів, за допомогою яких можна створювати об'єкти цих класів різними способами і в різних режимах.
Наприклад, файли можна відкривати тільки для читання, тільки для запису або для читання і запису. Ці режими доступу до файлу містяться в переліченні FileAccess, визначеному в просторі імен System. IO. Константи перелічення приведені в таблиці 11.2.
Таблиця 11.2
Значення FileAccess
Значення |
Опис |
Read |
Відкрити файл тільки для читання |
ReadWrite |
Відкрити файл для читання і запису |
Write |
Відкрити файл тільки для запису |
Можливі режими відкриття файлу визначені в переліченні FileMоdе (таблиця. 11.3).
Таблиця 11.3
Значення FilеМоdе
Значення |
Опис |
Append |
Відкрити файл, якщо він існує, і встановити поточний покажчик в кінець файлу. Якщо файл не існує, створити новий файл |
Create |
Створити новий файл. Якщо в каталозі вже існує файл з таким же ім'ям, він буде стертий |
CreateNew |
Створити новий файл. Якщо в каталозі вже існує файл з таким же ім'ям, виникає виключення IOEхсерtion |
Open |
Відкрити існуючий файл |
OpenOrCreate |
Відкрити файл, якщо він існує. Якщо немає, створити файл з таким ім'ям |
Truncate |
Відкрити існуючий файл. Після відкриття вміст файлу видаляється |
Режим FileMode.Append можна використовувати тільки спільно з доступом типу FileAccess.Write, тобто для файлів, що відкриваються для запису.
Режими сумісного використання файлу різними користувачами визначає перелічення FileShare (таблиця 11.4).
Таблиця 11.4
Значення FileShare
Значення |
Опис |
None |
Сумісне використання відкритого файлу заборонене. Запит на відкриття даного файлу завершується повідомленням про помилку |
Read |
Дозволяє відкривати файл для читання одночасно декільком користувачам. Якщо цей прапор не встановлений, запити на відкриття файлу для читання завершуються повідомленням про помилку |
ReadWrite |
Дозволяє відкривати файл для читання і запису одночасно декільком користувачам |
Write |
Дозволяє відкривати файл для запису одночасно декільком користувачам |