Типи значень і посилальні типи

На відміну від деяких мов програмування, C # має два різновиди типів даних: для значення і для посилання. Якщо продуктивність програми має істотне значення або є зацікавленість в тому, як C # управляє даними та пам'яттю, важливо знати відмінності між цими типами.

Тип значення зберігає свій вміст в пам'яті, виділеної в стеці. Наприклад, значення 42 в такому разі зберігається в області пам'яті, званої стеком.

При виході змінної x з області дії в зв'язку з завершенням виконання методу, в якому вона була оголошена, значення віддаляється з стека.

Використання стека є ефективним, але обмежений час існування типів значень робить їх менш придатними для спільного використання даних між різними класами.

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

int [] numbers = new int [10];

Boxing and Unboxing

int i = 67; // i is a value type

object o = i; // i is boxed

System.Console.WriteLine (i.ToString ()); // i is boxed

You will encounter unboxing when you use classes designed for use with objects: for example, using an ArrayList to store integers. When you store an integer in the ArrayList, it's boxed. When you retrieve an integer, it must be unboxed.

new System.Collections.ArrayList (); // list is a reference type

int n = 67; // n is a value type

list.Add (n); // n is boxed

n = (int) list [0]; // list [0] is unboxed

Упаковка і розпакування

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

int i = 67; // i is a value type

object o = i; // i is boxed

System.Console.WriteLine (i.ToString ()); // i is boxed

Розпакування застосовується для класів, призначених для роботи з об'єктами: наприклад, використання ArrayList для зберігання цілих чисел. Для зберігання цілих чисел в ArrayList використовується упаковка. Під час вилучення цілого числа повинна бути застосована розпакування.

new System.Collections.ArrayList (); // list is a reference type

int n = 67; // n is a value type

list.Add (n); // n is boxed

n = (int) list [0]; // list [0] is unboxed

Схожі статті