- •Розділ 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. Специфікатори формату для рядків с#
2.3. Рекомендації по програмуванню
Поняття, введені в цьому розділі, є базою для всього подальшого матеріалу. На перший погляд, вивчення видів лексем може здаватися зайвим (нехай їх розрізняє компілятор!), проте це абсолютно не так. При розробці програми необхідно розуміти, з яких елементів мови вона складається. Це допомагає і при пошуку помилок, і при зверненні до довідкової системи, і при вивченні нових версій мови. Більш того, вивчення будь-якої нової мови рекомендується починати саме з лексем, які в ній підтримуються.
Поняття типу даних лежить в основі більшості мовних засобів. При вивченні будь-якого типу необхідно розглянути дві речі: його внутрішнє уявлення (а отже, множина можливих значень величин цього типу), а також що можна робити з цими величинами. Типи даних є найважливішими характеристиками мови. Вибір найбільш відповідного типу для представлення даних - одна з необхідних умов створення ефективних програм.
Нові мови і засоби програмування з'являються безперервно, тому програміст вимушений вчитися все життя і повинен уміти:
грамотно поставити завдання;
вибрати відповідні мовні засоби;
вибрати найбільш відповідні для представлення даних структури;
розробити ефективний алгоритм;
написати і документувати надійну і таку, що легко модифікується програму;
забезпечити її вичерпне тестування.
Розділ 3. Змінні, іменовані константи, операції і вирази
3.1. Змінні і іменовані константи
Змінна - це іменована область пам'яті, призначена для зберігання даних певного типу. Під час виконання програми значення змінної можна змінювати. Всі змінні, що використовуються в програмі, мають бути описані явним чином. При описі змінною задаються ім'я і тип. Ім'я змінної служить для звернення до області пам'яті, в якій зберігається значення змінної. Ім'я повинне відповідати правилам іменування ідентифікаторів С#, відображати сенс величини, що зберігається, і бути легко розпізнаваним. Тип змінної вибирається, виходячи з діапазону і необхідної точності представлення даних. Наприклад, немає необхідності заводити змінну дійсного типу для зберігання величини, яка може набувати тільки цілих значень, - хоч би тому, що цілочисельні операції виконуються набагато швидше.
При оголошенні можна привласнити змінній деяке початкове значення, тобто ініціалізувати її, наприклад:
int а, b =1;
float x = 0.1, у = 0.1f;
Тут описані:
змінна а типу int, початкове значення якої не привласнюється;
змінна b типу int, її початкове значення дорівнює 1;
змінні х і у типу float, яким привласнені однакові початкові значення 0.1. Різниця між ними полягає в тому, що для ініціалізації змінної х спочатку формується константа типу double (це тип, що привласнюється за умовчанням літералам з дробовою частиною), а потім вона перетвориться до типу float; змінній у значення 0.1 привласнюється без проміжного перетворення.
При ініціалізації можна використовувати не тільки константу, але і вираз - головне, щоб на момент опису він був обчислюваним, наприклад:
int b = 1, а = 100;
int х = b * а + 25;
Ініціалізувати змінну прямо при оголошенні не обов'язково, але перед тим, як її використовувати в обчисленнях, це зробити все одно доведеться, інакше компілятор повідомить про помилку. Рекомендується ініціалізувати змінні при описі.
Втім, іноді цю роботу робить за програміста компілятор, це залежить від місцезнаходження опису змінною. Як вже наголошувалося, програма на C# складається з класів, усередині яких описують методи і дані. Змінні, описані безпосередньо усередині класу, називаються полями класу. Їм автоматично привласнюється так зване “значення по умовчанню”- як правило, це 0 відповідного типу.
Змінні, описані усередині методу класу, називаються локальними змінними. Їх ініціалізація покладається на програміста. У даному розділі розглядаються тільки локальні змінні простих вбудованих типів даних.
Так звана зона дії змінної, тобто область програми, де можна використовувати змінну, починається в точці її опису і триває до кінця блоку, усередині якого вона описана. Блок - це код, взятий у фігурні дужки. Основне призначення блоку - угрупування операторів. В С# будь-яка змінна описана усередині якого-небудь блоку: класу, методу або блоку усередині методу.
Ім'я змінної має бути унікальним в області її дії. Зона дії розповсюджується на вкладені в метод блоки, з цього виходить, що у вкладеному блоці не можна оголосити змінну з таким же ім'ям, як і в тому, що охоплює його, наприклад:
class X // початок опису класу X
{
int А; // поле А класу X
int В; // поле В класу X
void Y( ) // метод Y класу X
{
int С; // локальна змінна С, зона дії - метод Y
int А; // локальна змінна А (НЕ конфліктує з полем А)
{// ============ вкладений блок 1 ============
int D; // локальна змінна D, зона дії - блок
//int А; Неприпустимо! Помилка компіляції
С = В; // привласнення змінній С поля В
С = this.A; //привласнення змінній С поля А
}// ============ кінецьблоку1 ===============
{ // ============ вкладений блок 2 ============
int D; // локальна змінна D, зона дії - блок
} // ============ кінецьблоку2 ===============
} // кінець опису метода Y класу X
} //кінець опису класу X
У лістингу 3.1 приведений приклад програми, в якій описуються і виводяться на екран локальні змінні.
Лістинг 3.1. Опис змінних
using System;
namespace ConsoleApplicationl
{
class Classl
{
static void Main( )
{
int i = 3;
double у = 4.12;
decimal d = 600m;
string s = "Вася";
Console.Write( "i = " ); Console.WriteLine( i );
Console.Write( "y = " ); Console.WriteLine( у );
Console.Write( "d = " ); Console.WriteLine( d );
Console.Write( "s = "); Console.WriteLine( s );
}
}
}
У розглянутому прикладі використовується метод Write. Він робить те ж саме, що і Writeline, але не переводить рядок.
Можна заборонити змінювати значення змінної, задавши при її описі ключове слово const, наприклад:
const int b = 1;
const float x = 0.1, у = 0.1f; // const розповсюджується на обидві змінні
Такі величини називають константами. Вони застосовуються для того, щоб замість значень констант можна було використовувати в програмі їх імена. Це робить програму зрозумілішою і полегшує внесення до неї змін, оскільки змінити значення досить тільки в одному місці програми.
Поліпшення читабельності відбувається тільки при осмисленому виборі імен констант. У добре написаній програмі взагалі не повинно зустрічатися інших чисел окрім 0 і 1, решта всіх чисел повинна задаватися іменованими константами з іменами, що відображають їх призначення.
Іменовані константи повинні обов'язково ініціалізуватися при описі. При ініціалізації можна використовувати не тільки константу, але і вираз - головне, щоб він був обчислюваним на етапі компіляції, наприклад:
const int b = 1, а = 100;
const int х = b * а + 25;