Назад к вопросам
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