Книга: C# для профессионалов. Том II
Типы значений и ссылочные типы
Типы значений и ссылочные типы
C# разделяет все типы данных на две разновидности: типы значений и ссылочные типы. Это различие не имеет эквивалента в C++, где переменные всегда неявно содержат значения, если только переменная специально не объявлена как ссылка на другую переменную.
В C# тип значения действительно содержит свое значение. Все предопределенные типы данных в C# являются типами значений, за исключением object
и string
. Если определить свои собственные структуры и перечисления, они также будут типами значений. Это означает, что простые типы данных в C# обычно действуют точно таким же образом как в C++, когда им присваивают значения.
int I = 10;
long J = I; // создаёт копию значения 10
I = 15; //не влияет на J
Ссылочный тип, как предполагает его имя, содержит только ссылку на то место в памяти, где хранятся данные. Синтаксически он действует таким же образом как ссылки в C++, но в терминах того, что происходит реально, ссылки C# ближе к указателям C++. В C# object
и string
являются ссылочными типами, как и любые определенные самостоятельно классы. Ссылки C# могут быть переназначены для указания на другие элементы данных, по большей части таким же образом, как можно переназначить указатели C++. Также ссылкам C# можно присваивать значение null
для указания, что они ни на что не ссылаются. Например, возьмем класс с именем MyClass
, который имеет открытое свойство Width
.
MyClass My1 = new MyClass(); // в C# new просто вызывает конструктор
My1.Width = 20;
MyClass My2 = My1; // My2 указывает теперь на то же место
// в памяти, что и My1
Му2.Width = 30; // Теперь My1.Width = 30, так как My1
// и Му2 указывают на одно место в памяти
My2 = null; // Теперь My2 не ссылается ни на что,
// My1 по прежнему ссылается на тот же объект
В C# невозможно программным путем объявить определенную переменную как тип значения или как ссылочный тип, это определяется исключительно типом данных переменной.
Тип значения и ссылочный тип данных имеют особенности в управлении памятью, так как ссылочные типы всегда хранятся в куче, в то время как типы значений обычно хранятся в стеке. Это рассматривается более подробно в следующем разделе об управлении памятью.
- Типы значений в C#
- Типы, характеризуемые значениями и содержащие ссылочные типы
- Ссылочные типы
- Типы данных значений и ссылочные типы данных
- Типы данных
- Типы данных для работы с датой и временем
- Большие целые типы
- Типы страниц и их использование
- 1.2.3. Константы, переменные и типы
- 4. Лекция: Типы данных
- 9.1. Классы и прототипы
- 4. Кортежи. Типы кортежей