- •Міністерство освіти і науки, молоді та спорту україни
- •Розділ 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. Специфікатори формату для рядків с#
13.2. Простір імен System.Collections
У просторі імен System.Collections визначені набори стандартних колекцій і інтерфейсів, які реалізовані в цих колекціях. У таблиці 13.2 приведені найбільш важливі інтерфейси.
Таблиця 13.2
Інтерфейси простору імен System.Collections
Інтерфейс |
Призначення |
ICollection |
Визначає загальні характеристики (наприклад, розмір) для набору елементів |
IComparer |
Дозволяє порівнювати два об'єкти |
IDictionary |
Дозволяє представляти вміст об'єкту у вигляді пар “ім'я-значення” |
IDictionaryEnumerator |
Використовується для нумерації вмісту об'єкту, що підтримує інтерфейс IDictionary |
Продовження таблиці 13.2
Інтерфейс |
Призначення |
IEnumerable |
Повертає інтерфейс IEnumerator для вказаного об'єкту |
IEnumerator |
Зазвичай використовується для підтримки оператора foreach відносно об'єктів |
IHashCodeProvider |
Повертає хеш-код для реалізації типу із застосуванням вибраного користувачем алгоритму хешування |
IList |
Підтримує методи додавання, видалення і індексування елементів в списку об'єктів |
У таблиці 13.3 перераховані основні колекції, визначені в просторі System. Collections.
Таблиця 13.3
Колекції простору імен System.Collections
Клас |
Призначення |
Найважливіші з реалізованих інтерфейсів |
ArrayList |
Масив, що динамічно змінює свій розмір |
IList, ICollection, IEnumerable, ICloneabl |
BitArray |
Компактний масив для зберігання бітових значень |
ICollection, IEnumerable, ICloneable |
Hashtable |
Хеш-таблиця |
IDictionary, ICollection, IEnumerable, ICloneable |
Queue |
Черга |
ICollection, ICloneable, IEnumerable |
SortedList |
Колекція, відсортована по ключах. Доступ до елементів - по ключу або по індексу |
IDictionary, ICollection, IEnumerable, ICloneable |
Stack |
Стек |
ICollection, IEnumerable |
Простір імен System.Collections.Specialized включає спеціалізовані колекції, наприклад колекцію рядків StringCollection і хеш- таблицю із рядковими ключами StringDictionary.
Як приклад стандартної колекції розглянемо клас ArrayList.
13.3. Клас ArrayList
Основним недоліком звичайних масивів є те, що об'єм пам'яті, який потрібен для зберігання їх елементів, має бути виділений до початку роботи з масивом. Клас ArrayList дозволяє програмістові не піклуватися про виділення пам'яті і зберігати в одному і тому ж масиві елементи різних типів.
За умовчанням при створенні об'єкту типу ArrayList будується масив з 16 елементів типу object. Можна задати бажану кількість елементів в масиві, передавши його в конструктор або встановивши як значення властивості Capacity, наприклад:
ArrayList arrl = new ArrayList(); // створюється масив з 16 елементів
ArrayList arr2 = new ArrayList(1000); // створюється масив з 1000 елементів
ArrayList аrrЗ = new ArrayList();
arr3.Capacity = 1000; // кількість елементів задається
Основні методи і властивості класу Arraylist перераховані в таблиці 13.4.
Таблиця 13.4
Основні елементи класу Arraylist
Елемент |
Вигляд |
Опис |
Capacity |
Властивість |
Ємність масиву (кількість елементів, які можуть зберігатися в масиві) |
Count |
Властивість |
Фактична кількість елементів масиву |
Item |
Властивість |
Отримати або встановити значення елементу по заданому індексу |
Add |
Метод |
Додавання елементу в кінець масиву |
AddRange |
Метод |
Додавання серії елементів в кінець масиву |
BinarySearch |
Метод |
Двійковий пошук у відсортованому масиві або його частині |
Clear |
Метод |
Видалення всіх елементів з масиву |
Clone |
Метод |
Поверхневе копіювання елементів одного масиву в інший масив |
CopyTo |
Метод |
Копіювання всіх або частини елементів масиву в одновимірний масив |
GetRange |
Метод |
Набуття значень підмножини елементів масиву у вигляді об'єкту типу Arraylist |
IndexOf |
Метод |
Пошук входження елементу (повертає індекс елементу або -1, якщо елемент не знайдений) |
Insert |
Метод |
Вставка елементу в задану позицію (по заданому індексу) |
InsertRange |
Метод |
Вставка групи елементів, починаючи із заданої позиції |
LastIndexOf |
Метод |
Пошук останнього входження елементу в одновимірний масив |
Remove |
Метод |
Видалення першого входження заданого елементу |
RemoveAt |
Метод |
Видалення елементу з масиву по індексу |
Продовження таблиці 13.4
Елемент |
Вигляд |
Опис |
RemoveRange |
Метод |
Видалення групи елементів з масиву |
Reverse |
Метод |
Зміна порядку проходження елементів на зворотний |
SetRange |
Метод |
Установка значень елементів масиву в заданому діапазоні |
Sort |
Метод |
Впорядковування елементів масиву або його частини |
TrimToSize |
Метод |
Установка ємності масиву рівною фактичній кількості елементів |
Клас ArrayList реалізований через клас Array, тобто містить закрите поле цього класу. Оскільки всі типи в С# є нащадками класу object, масив може містити елементи довільного типу. Навіть якщо в масиві зберігаються звичайні цілі числа, тобто елементи значущого типу, внутрішній клас є масивом посилань на екземпляри типу object, які є упакованим типом-значенням. Відповідно, при занесенні в масив виконується упаковка, а при витяганні - розпаковування елементу. Це не може не позначитися на швидкодії алгоритмів, які використовують ArrayList.
Якщо при додаванні елементу в масив виявляється, що фактичну кількість елементів масиву перевищує його ємність, вона автоматично подвоюється, тобто відбувається повторне виділення пам'яті і переписування туди всіх існуючих елементів.
Приклад занесення елементів в екземпляр класу ArrayList:
arrl.Add(123);
arrl.Add( -2 );
arrl.Add("Вася");
Доступ до елементу виконується по індексу, проте при цьому необхідно явним чином привести отримане посилання до цільового типу, наприклад:
int а = (int) arrl [0];
int b = (int) arrl [l];
string s = (string) arrl [2];
Спроба приведення до невідповідного типу зберігається в елементі, викликає генерацію виключення InvalidCastException.
Для підвищення надійності програм застосовується наступний прийом: екземпляр класу ArrayList оголошується закритим полем класу, в якому необхідно зберігати колекцію значень певного типу, а потім описуються методи роботи з цією колекцією, які делегують свої функції методам ArrayList. Цей спосіб ілюструється в лістингу 13.1, де створюється клас для зберігання об'єктів типу Monster і похідних від нього.
Лістинг 13.1. Колекція об'єктів
using System;
using System.Collections;
namespace ConsoleApplicationl
{
class Monster { ... }
class Daemon : Monster { ... }
class Stado : IEnumerable
{
private ArrayList list;
public Stado() { list = new ArrayList(); }
public void Add( Monster m ) { list.Add( m ) ; }
public void RemoveAt( int i ) {list.RemoveAt( i ); }
public void Clear() { list.Clear(); }
public IEnumerator GetEnumerator()
{ return list.GetEnumerator(); }
}
class Classl
{
static void Main()
{
Stado stado = new Stado();
stado.Add( new Monster( "Monia" ) );
stado.Add( new Monster( "Monk" ) );
stado.Add( new Daemon ( "Dimon", 3 ) );
stado.RemoveAt( 1 );
foreach ( Monster x in stado ) x. Passport();
}
}
}
Результат роботи програми:
Monster Monia health = 100 ammo = 100
Daemon Dimon health = 100 ammo = 100 brain = 3
Недоліком цього рішення є те, що для кожного методу стандартної колекції доводиться описувати метод-оболонку, що викликає стандартний метод. У С# з'явилися класи-прототипи (generics), що дозволяють вирішити цю проблему. Ми розглянемо їх в наступному розділі.