Угода
Угода про обробку персональних даних
Типи значень і посилальні типи даних C #
Типи даних в C # поділяються на типи значень (value types) і посилальні типи (reference types).
- цілочисельні;
- З плаваючою комою;
- десятковий;
- логічний;
- структури;
- Перерахування.
Різниця між ними в тому, що типи значень зберігають дані. а посилальні типи - це посилання на дані. Їх змінні розміщуються в різних областях пам'яті, виділеної для програми, іменованих стеком (stack) і купою (heap).
Що таке стек і купа
Стек (в перекладі з англійської - стопка) - послідовна структура даних, в якій кожний наступний елемент, додається в кінець. У C # це працює наступним чином: при запуску програми в виділеної пам'яті резервується безперервна область, в якій міститься покажчик закінчення стека. Нові дані (наприклад, при ініціалізації змінної) поміщаються в кінець стека, при цьому покажчик зміщується.
В даному прикладі, під час виконання методу Sample Method в стек по черзі будуть додаватися змінні x, a і y і їх значення. Коли метод закінчить роботу, пам'ять, в якій зберігаються дані про ці змінних, буде очищена, і покажчик стека знову зміститься.
Різниця між значенням і посиланням
Крім використання різних областей даних, типи значень і посилань мають ще одну вкрай важливу відмінність, яке найпростіше відразу пояснити на прикладі:
Отже, звідки взялися такі значення змінних a, b, c і d зрозуміло. Але ось чому поле cl1.x стало дорівнює 3, адже ми привласнювали йому 1? В цьому і криється суть різниці значень і посилань в C #.
Коли ми використовуємо операцію присвоювання для змінних типу значень, дані перезаписувати в їх області пам'яті, а самі змінні між собою ніяк не пов'язані, і їх подальша зміна не впливає один на одного.
А ось при присвоєнні cl2 = cl1 сталося наступне: cl2 почав вказувати на ту ж область пам'яті, що і cl1. а ті дані, на які раніше посилався cl2. були видалені складальником сміття через відсутність посилань.
Так як cl1 і cl2 тепер вказують на одну і ту ж область, то і взаємодіяти з даними в ній можна однаково через обидві змінні. А дані, що зберігаються в цій області, будуть очищені тільки при видаленні обох посилань, що неодмінно станеться після завершення роботи методу.
Створення змінних в мові програмування C #