Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЕМА 4. ТИПИ ДАНИХ ТА ЗМІННІ..docx
Скачиваний:
5
Добавлен:
22.11.2019
Размер:
146.77 Кб
Скачать

6. Поняття стеку і кучі. Значимі та посилальні типи даних у .Net і с#.

ПОНЯТТЯ СТЕКУ І КУЧІ

Стек відноситься до області пам'яті, підтримуваної процесором, в якій зберігаються локальні змінні. Доступ до стека у багато разів швидший, ніж до загальної області пам'яті, тому використання стека для зберігання даних прискорює роботу вашої програми. У С# розмірні типи (наприклад, цілі числа) розташовуються в стеку: для їх значень зарезервована область в стеку, і доступ до неї здійснюється по назві змінної.

Посилальні типи (наприклад, об'єкти) розташовуються в купі. Купа — це оперативна пам'ять вашого комп'ютера. Доступ до неї здійснюється повільніше, ніж до стека. Коли об'єкт розташовується в купі, то змінна зберігає лише адресу об'єкту. Ця адреса зберігається в стеку. За адресою програма має доступ до самого об'єкту, всі дані якого зберігаються в загальній пам'яті (купі).

«Збиральник сміття» (Garbage Collector) знищує об'єкти, розташовані в стеку, кожен раз, коли відповідна змінна виходить за область видимості. Таким чином, якщо ви оголошуєте локальну змінну в межах функції, то об'єкт буде помічений як об'єкт для «збирання сміття». І він буде видалений з пам'яті після завершення роботи функції. Об'єкти у купі теж очищаються збиральником сміття, після того, як кінцеве посилання на них буде знищено.

ЗНАЧИМІ ТА ПОСИЛАЛЬНІ ТИПИ ДАНИХ У .NET І С#

Усі типи даних у C# поділяються на значимі та типи-посилання.

Значимі типи:

  • містять у собі об’єкти даних;

  • не можуть бути пустими.

Типи-посилання:

  • містять у собі посилання на об’єкт даних;

  • можуть бути пустими (null).

Які типи даних відносяться до значимих, а які до типів-посилань було розглянуто у питанні 1.

Запишемо простий приклад:

int a = 1000;

int b = a;

b = 2000;

Логічно, що після виконання цього коду a = 1000, b = 2000 - це принцип роботи значимих типів - у змінну копіюється значення і не привязується до змінної з якої воно було взяте.

Тепер давайте створимо просту структуру Point.

Приклад 11. Використання структури (значимий тип).

1: static void Main(string[] args)

2: {

3: Point point1 = new Point();

4: point1.x = 111;

5: point1.y = 111;

6:  

7: //Виведемо на екран змінну point1

8: Console.WriteLine("point1.x = {0}; point1.y = {1}", point1.x, point1.y);

9:  

10: // Створимо змінну point2

11: Point point2 = point1;

12:  

13: //Виведемо на екран змінну point2

14: Console.WriteLine("point2.x = {0}; point2.y = {1}", point2.x, point2.y);

15:  

16: Console.WriteLine("\t---- Change point 2-----");

17: //Змінимо значення параметрів у point2

18: point2.x = 777;

19: point2.y = 777;

20:  

21: //Виведемо point1 та point2

22: Console.WriteLine("point1.x = {0}; point1.y = {1}", point1.x, point1.y);

23: Console.WriteLine("point2.x = {0}; point2.y = {1}", point2.x, point2.y);

24: }

25:  

26: Struct Point

27: {

28: public int x;

29: public int y;

30: }

Рис. 3. Результат виконання прикладу 11 (Значимий тип).

Як бачимо після зміни значень х та у для змінної point2 значення змінної рoint1 не змінилося! Все правильно, адже структура є значимим типом і тому відбувається копіювання значень при присвоєнні.

Тепер давайте замінимо структуру Point на клас.

Приклад 12. Використання класу (посилальний тип).

1: class Point

2: {

3: public int x;

4: public int y;

5: }

Рис. 4. Результат виконання прикладу 11 з класом (12) (Посилальний тип).

Як бачимо значення point1 змінилося! Посилальні типи даних вказують лише на ділянку памяті, у якій знаходиться значення, а не на саме значення. При присвоєнні не відбувається копіювання значень, а копіювання посилання.

Для узагальнення опишемо все це у таблиці:

Таблиця 8

Можливість звужуючого перетворення типів даних

Характеристика

Значимий тип

Тип-посилання

Змінна містить

Значення

Посилання на значення

Змінна зберігається

У стек

У кучі

Значення по замовчуванню

0, false,

‘\0’ null

Оператор присвоєння

Копіює значення

Копіює посилання

Приклад

Пояснення:

Відповідно до назв, змінна в разі використання типів-значень містить власне значення, а при використанні типів-посилань – не самкїе значення, а лише посилання на нього. Місцем зберігання змінної, визначеної як тип-значення, є стек, а визначеною як посилальний тип – «купа» (останнє необхідне для динамічного виділення і звільнення пам'яті для зберігання змінної довільним чином).

Значенням, яким змінна ініціалізувалася за умовчанням (необхідність виконання цієї вимоги диктується ідеологією безпеки Microsoft .NET) в разі визначення за допомогою типа-значення є 0 (для чисельного типу даних), false (для логічного типу даних), '\0' (для символьного типу даних), а в разі визначення за допомогою типу-посилання – значення порожнього посилання null.

ЗАДАЧІ

Задача 1. Виведіть на екран наступний текст: 

"Саме знання нікому їсти не дасть."

\І. Я. Франко\

Задача 2. Напишіть програму, яка обчислює суму, добуток, різницю, частку та остачу від ділення двох заданих чисел.

Задача 3. Напишіть програму, яка ковертує суму грн.->euro.

Задача 4. Напишіть поредню программу з умовою, що суму у грн. та курс валюти задає користувач.

Задача 5. У C# немає функції, яка обчислює квадрат числа. Написати програму, яка обчислює квадрат введеного числа.

Задача 6. Обрахувати ціну покупки, якщо відомо:

  • ціну за одиницю товару;

  • кількість товару;

  • знижка (у % від загальної суми).

Задача 8. Дано сторону квадрата (вводиться з клавіатури користувачем). Визначити довжину діагоналі.

Задача 9. Дано катети прямокутного трикутника (вводяться з клавіатури користувачем). Визначити довжину гіпотенузи.

15