logo
Учебник_ПОА

Типы значений и ссылочные типы

В отличие от некоторых языков программирования, C# имеет две разновидности типов данных: для значения и для ссылки. Если производительность приложения имеет существенное значение или есть заинтересованность в том, как C# управляет данными и памятью, важно знать различия между этими типами.

Если в объявлении переменной используется один из основных встроенных типов данных или определенная пользователем структура данных, значит мы имеем дело с типом значения. Исключение составляет тип данных string, который является ссылочным типом.

Тип значения хранит свое содержимое в памяти, выделенной в стеке. Например, значение 42 в таком случае хранится в области памяти, называемой стеком.

int x = 42;

При выходе из области действия переменной x в связи с завершением выполнения метода, в котором она была объявлена, значение удаляется из стека.

Использование стека является эффективным, но ограниченное время существования типов значений делает их менее подходящими при совместном использовании данных различными классами.

В отличие от этого ссылочный тип, такой как экземпляр класса или массив, размещается в другой области памяти, называемой кучей. В следующем примере пространство, необходимое для массива из десяти целых чисел, размещается в куче.

int[] numbers = new int[10];

Эта память не возвращается к куче при завершении метода, она освобождается только, когда система сборки мусора C# определит, что она больше не нужна. Объявление ссылочных типов увеличивает расход ресурсов, но их преимущество заключается в том, что они могут быть доступны из других классов.