В C# все типы данных делятся на два принципиально разных вида: типы значений и ссылочные типы. Понимание различий между ними критически важно для эффективной работы с языком.
| Характеристика | Типы значений | Ссылочные типы |
|---|---|---|
| Хранение | Хранятся непосредственно | Хранится ссылка на объект |
| Расположение | Стек или куча (в составе объекта) | Управляемая куча |
| Присваивание | Копируется значение | Копируется ссылка |
| Примеры | int, bool, struct | class, string, array |
| Значение по умолчанию | 0, false и т.д. | null |
System.ValueTypenull (кроме Nullable-типов)int, float, bool, char и т.д.struct (пользовательские структуры)enum (перечисления)public struct Point
{
public int X;
public int Y;
}
Point p1 = new Point { X = 10, Y = 20 };
Point p2 = p1; // Создается КОПИЯ значения
p2.X = 30; // p1.X останется 10
System.Object (если не указано иное)nullclass (классы)interface (интерфейсы)stringpublic class Person
{
public string Name;
public int Age;
}
Person p1 = new Person { Name = "Alice", Age = 25 };
Person p2 = p1; // Копируется ССЫЛКА
p2.Age = 30; // Изменяется и p1.Age, так как это тот же объект
// Тип значения
int a = 10;
int b = a; // Создается копия значения
// Ссылочный тип
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = sb1; // Копируется только ссылка
// Тип значения
int x = 5, y = 5;
bool result1 = (x == y); // true - сравниваются значения
// Ссылочный тип
object o1 = new object();
object o2 = new object();
bool result2 = (o1 == o2); // false - сравниваются ссылки
Используйте struct (тип значения), когда:
Используйте class (ссылочный тип), когда:
Понимание различий между типами значений и ссылочными типами - фундаментальное знание для C# разработчика. struct - это тип значения, class - ссылочный тип. Типы значений хранятся в стеке (если это локальные переменные) или в куче (как часть объектов), а ссылочные типы всегда размещаются в управляемой куче. Выбор между ними должен основываться на требованиях к производительности и семантике работы с данными.