Типи значень і посилальні типи даних c #

Угода

Угода про обробку персональних даних

Типи значень і посилальні типи даних 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 #

Схожі статті