Какие типы данных бывают в .NET и в чём различие между значимыми и ссылочными типами?

В .NET существует две основные категории типов данных: типы значений (Value Types) и ссылочные типы (Reference Types).

Короткий ответ

Что ответить на собеседовании

В .NET существует две основные категории типов данных: типы значений (Value Types) и ссылочные типы (Reference Types).

Подробный разбор

Ответ с пояснениями

В .NET существует две основные категории типов данных: типы значений (Value Types) и ссылочные типы (Reference Types).

Типы значений (Value Types):

  • Хранят свои данные непосредственно в стеке или внутри типа, в котором они объявлены.

  • При присваивании или передаче по значению создается копия данных.

  • Наследуются от System.ValueType.

  • Примеры:

    • Предопределенные value types:

      • Целочисленные типы: sbyte, byte, short, ushort, int, uint, long, ulong.
      • Типы с плавающей запятой: float, double.
      • Десятичный тип: decimal.
      • Логический тип: bool.
      • Символьный тип: char.
    • Пользовательские value types: struct, enum.

Ссылочные типы (Reference Types):

  • Хранят ссылку на данные, которые находятся в куче.

  • При присваивании или передаче по значению копируется только ссылка, указывающая на те же данные в куче.

  • Наследуются от System.Object.

  • Примеры:

    • Предопределенные reference types:

      • Строковый тип: string.
      • Объектный тип: object.
    • Пользовательские reference types: class, interface, delegate.

    • Массивы.

// Примеры value types
int age = 30; // Целочисленный тип
bool isActive = true; // Логический тип
char initial = 'J'; // Символьный тип

// Объявление struct (пользовательский value type)
struct Point
{
    public int X;
    public int Y;
}

// Примеры reference types
string name = "Alice"; // Строковый тип
object data = 123; // Объектный тип

// Объявление class (пользовательский reference type)
class Person
{
    public string Name { get; set; }
}

// Объявление массива (reference type)
int[] numbers = { 1, 2, 3 };

Также стоит упомянуть о нулябельных типах значений (Nullable Value Types), которые позволяют типам значений иметь значение null. Они объявляются с помощью суффикса ? или типа Nullable<T>.

int? optionalAge = null; // Nullable int
Nullable<DateTime> birthDate = new DateTime(2000, 1, 1); // Эквивалентно DateTime?

Выбор между типами значений и ссылочными типами влияет на производительность, управление памятью и поведение при присваивании и передаче параметров.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее