Назад к вопросам
Junior
133
questionbank

В чем разница между ссылочными (Reference Type) и значимыми типами (Value Type) в C#?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Ссылочные типы хранят адрес в памяти, где лежат данные. Значимые типы хранят сами данные непосредственно в переменной.

Ссылочные типы:

  • Наследуются от System.Object.
  • Размещаются в куче (heap).
  • При присваивании переменной ссылочного типа другой переменной, копируется ссылка на данные, а не сами данные.
  • По умолчанию инициализируются null.
  • Включают классы (class), интерфейсы (interface), делегаты (delegate), массивы (array), строки (string).

Значимые типы:

  • Наследуются от System.ValueType (который, в свою очередь, наследуется от System.Object).
  • Размещаются в стеке (stack) или внутри объекта, если являются полем ссылочного типа.
  • При присваивании переменной значимого типа другой переменной, копируются сами данные.
  • По умолчанию инициализируются нулевым значением (0 для чисел, false для bool, пустое значение для struct).
  • Включают структуры (struct), перечисления (enum), встроенные типы данных (int, float, bool и т.д.).

Пример:

// Ссылочный тип
public class MyClass
{
    public int Value;
}

// Значимый тип
public struct MyStruct
{
    public int Value;
}

// Использование
MyClass obj1 = new MyClass { Value = 10 };
MyClass obj2 = obj1; // obj2 и obj1 ссылаются на один и тот же объект в куче
obj2.Value = 20; // Изменение через obj2 влияет на obj1
Console.WriteLine(obj1.Value); // Выведет 20

MyStruct s1 = new MyStruct { Value = 10 };
MyStruct s2 = s1; // Копируются данные, s2 - независимая копия
s2.Value = 20; // Изменение через s2 не влияет на s1
Console.WriteLine(s1.Value); // Выведет 10