- •Розділ 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. Специфікатори формату для рядків с#
5.1. Привласнення і порівняння об'єктів
Механізм виконання привласнення один і той же для величин будь-якого типу, як посилального, так і значущого, проте результати розрізняються. При наданні значення копіюється значення, а при привласненні посилання - посилання, тому після привласнення одного об'єкту іншому ми отримуємо два посилання, вказуючи на одну і ту ж область пам'яті (рис. 5.2).
Рисунок ілюструє ситуацію, коли було створено три об'єкти, а, b і с, а потім виконано привласнення b = с. Старе значення b стає недоступним і очищається складальником сміття. З цього виходить, якщо змінити значення однієї величини посилального типу, це може відбитися на іншій (в даному випадку, якщо змінити об'єкт через посилання с, об'єкт b також змінить своє значення).
Аналогічна ситуація з операцією перевірки на рівність. Величини значущого типу рівні, якщо рівні їх значення. Величини посилального типу рівні, якщо вони посилаються на одні і ті ж дані (на рисунку об'єкти b і с рівні, але а не рівне b навіть при рівності їх значень або якщо вони обидві рівні null).
Рис. 5.1. Склад класу
Рис. 5.2. Привласнення об'єктів
5.2. Дані: поля і константи
Дані, що містяться в класі, можуть бути змінними або Змінні, описані в класі, називаються полями класу.
При описі елементів класу можна також указувати атрибути і специфікатори, які задають різні характеристики елементів. Синтаксис опису елементу даних приведений нижче:
[ атрибути ] [ специфікатори ] [ const ] тип ім'я [ = начальне_значення ]
Атрибути будуть розглянуті в розділі 12, а можливі специфікатори полів і констант перераховані в таблиці 5.2. Для констант можна використовувати тільки специфікатори 1- 6.
Таблиця 5.2.
Специфікатори полів і констант класу
-
№
Специфікатор
Опис
1
new
Новий опис поля, що приховує успадкований елемент класу
2
public
Доступ до елементу не обмежений
3
protected
Доступ тільки з даного класу і похідних класів
4
internal
Доступ тільки з даної збірки
5
protected internal
Доступ тільки з даного класу і похідних класів і з даної збірки
6
private
Доступ тільки з даного класу
7
static
Одне поле для всіх екземплярів класу
8
readonly
Поле доступне тільки для читання
9
volatile
Поле може змінюватися іншим процесом або системою
За умовчанням елементи класу вважаються за закриті ( private ) . Для полів класу цей вид доступу є переважним, оскільки поля визначають внутрішню будову класу, яка має бути прихована від користувача. Всі методи класу мають безпосередній доступ до його закритих полів.
Поля, описані із специфікатором static, а також константи існують в єдиному екземплярі для всіх об'єктів класу, тому до них звертаються не через ім'я екземпляра, а через ім'я класу. Якщо клас містить тільки статичні елементи, екземпляр класу створювати не потрібно.
Звернення до поля класу виконується за допомогою операції доступу (крапка). Праворуч від крапки задається ім'я поля, зліва - ім'я екземпляра для звичайних полів або ім'я класу для статичних. У лістингу 5.1 приведені приклад простого класу Demo і два способи звернення до його полів.
Лістинг 5.1. Клас Demo, що містить поля і константу
using System;
namespace ConsoleApplication1
{
class Demo
{
public int a = 1; // поле даних
public const double с = 1.66; // константа
public static string s = "Demo"; // статичне поле класу
double y; // закрите поле даних
}
class Classl
{
static void Main( )
{
Demo x = new Demo( ); // створення екземпляра класу Demo
Console . WriteLine ( x.a ); // x.a - звернення до поля класу
Console . WriteLine ( Demo.с ); // Demo.с - звернення до константи
Console . WriteLine ( Demo.s ); // звернення до статичного поля
}
}
}
Поле у вивести на екран аналогічним чином не вдасться: воно є закритим, тобто недоступно ззовні ( з класу Classl). Оскільки значення цьому полю явним чином не привласнене, середовище привласнює йому значення нуль.
Всі поля спочатку автоматично ініціалізувалися нулем відповідного типу (наприклад, полям типу int привласнюється 0, а посиланням на об'єкти - значення nu11) . Після цього полю привласнюється значення, задане при його явній ініціалізації. Завдання початкових значень для статичних полів виконується при ініціалізації класу, а звичайних - при створенні екземпляра.
Поля із специфікатором readonly призначені тільки для читання. Встановити значення такого поля можна або при його описі, або в конструкторі (конструктори розглядаються далі в цьому розділі).