Вправа – типи посилань на виявлення
- 8 хвилин
Типи посилань включають масиви, класи та рядки. Типи посилань розглядаються не так, як типи значень, що стосуються способу збереження значень під час виконання програми.
У цій вправі ви дізнаєтеся, як типи посилань відрізняються від типів значень і як за допомогою new оператора пов'язати змінну зі значенням в пам'яті комп'ютера.
Відмінності типів посилань від типів значень
Змінна типу значення зберігає свої значення безпосередньо в області сховища, яка називається стеком. Стек – це пам'ять, виділена для коду, який зараз запущено на ЦП (також відомий як рамка стека або рамка активації). Коли виконувана рамка стосу завершиться, значення в стосі видаляються.
Змінна типу посилання зберігає свої значення в окремій області пам'яті, яка називається купою. Купа – це область пам'яті, до яку надано спільний доступ у багатьох програмах, запущених в операційній системі одночасно. Середовище виконання .NET взаємодіє з операційною системою, щоб визначити, які адреси пам'яті доступні, і запитує адресу, де вона може зберігати значення. Середовище виконання .NET зберігає значення, а потім повертає адресу пам'яті змінної. Коли код використовує змінну, середовище виконання .NET без проблем шукає адресу, що зберігається в змінну, і отримує значення, яке зберігається там.
Далі ви напишете код, який чіткіше ілюструє ці ідеї.
Визначення змінної типу посилання
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати весь код із попередніх вправ.Оновіть код у редакторі коду Visual Studio, як показано нижче.
int[] data;Попередній код визначає змінну, яка може містити значення масиву типу
int.На даний момент це лише змінна,
dataяка може містити посилання, а точніше, адресу пам'яті значення в купі. Оскільки вона не вказує на адресу пам'яті, вона називається null-посиланням.Створення екземпляра масиву
intза допомогою ключовогоnewсловаОновіть код у редакторі коду Visual Studio, щоб створити та призначити новий екземпляр масиву
int, використовуючи такий код:int[] data; data = new int[3];Ключове
newслово інформує .NET Runtime про створення екземпляра масивуint, а потім координує роботу з операційною системою, щоб зберегти в пам'яті розмір масиву для трьох значень int. Середовище виконання .NET відповідає вимогам і повертає адресу пам'яті новогоintмасиву. Нарешті, адреса пам'яті зберігається в змінних даних. Елементиintмасиву за замовчуванням використовуються для значення0, оскільки це стандартнеintзначення .Змінення прикладу коду для виконання обох операцій в одному рядку коду
Два рядки коду на попередньому кроці зазвичай скорочуються до одного рядка коду, щоб оголосити змінну, і створити новий екземпляр масиву
int. Змініть код від кроку 3 до наведеного нижче.int[] data = new int[3];Хоча немає виходу для спостереження, сподіваюся, ця вправа додала ясності до того, як синтаксис C# відноситься до кроків процесу роботи з типами посилань.
Що відрізняється від типу даних рядка C#?
Тип string даних також є типом посилання. Можливо, вам буде цікаво, new чому оператор не використовувався під час оголошення рядка. Це суто зручність, яку надають дизайнери C#.
string Оскільки тип даних використовується так часто, можна використовувати такий формат:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Однак за лаштунками створюється й ініціалізовано новий екземпляр System.String "Привіт, світ!".
Практичні проблеми з використанням типів значень і посилань
-
Тип значення (int): у цьому прикладі
val_Aтаval_Bє цілими типами значень.
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
Ви побачите такий результат:
--Value Types--
val_A: 2
val_B: 5
Коли val_B = val_A виконується, значення val_A копіюється та зберігається в val_B. Таким чином, коли val_B змінюється, val_A залишається незмінним.
-
Тип посилання (масив): у цьому прикладі
ref_Aвониref_Bє типами посилань на масиви.
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
Ви побачите такий результат:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
Під ref_B = ref_A час виконання вказує на те саме розташування пам'яті, ref_B що ref_Aй . Таким чином, коли ref_B[0] змінюється, також змінюється, ref_A[0] оскільки вони обидва вказують на те саме розташування пам'яті. Це ключова відмінність між типами значень і типами посилань.
Повторити введення
- Типи значень можуть містити менші значення та зберігатися в стосі. Типи посилань можуть містити великі значення, а новий екземпляр типу посилання створюється за
newдопомогою оператора. Змінні типу посилання зберігають посилання (адресу пам'яті) на фактичне значення, яке зберігається в купі. - Типи посилань включають масиви, рядки та класи.
Перевірте свої знання
Зворотний зв’язок
Чи була ця сторінка корисна?
Ні
Потрібна допомога із цією темою?
Хочете скористатися Ask Learn, щоб отримати пояснення чи інструкції із цієї теми?