Что такое Nullable-тип?csharp-27

Nullable-тип (или "обнуляемый тип") — это структура в C#, которая позволяет типам-значениям (value types) принимать значение null, что обычно невозможно для таких типов по умолчанию.

Почему нужны Nullable-типы?

В C# типы-значения (int, bool, double, struct и т.д.) не могут быть null — они всегда содержат какое-то значение по умолчанию (например, 0 для int). Однако в реальных сценариях часто требуется явно обозначить отсутствие значения. Для этого и существуют Nullable-типы.

int number = null; // Ошибка компиляции: int не может быть null
int? nullableNumber = null; // Корректно: int? может быть null

Как объявляется Nullable-тип?

Есть два способа объявления:

  1. С использованием синтаксиса ? (рекомендуемый способ)

    int? nullableInt = null;
    DateTime? nullableDate = null;
    
  2. С использованием структуры Nullable<T>

    Nullable<int> nullableInt = null;
    Nullable<DateTime> nullableDate = null;
    

Основные свойства и методы

У Nullable-типов есть два важных свойства:

  • HasValue: возвращает true, если переменная содержит значение, и false, если она null.
  • Value: возвращает значение, если оно есть (иначе выбрасывает InvalidOperationException).
int? number = 42;

if (number.HasValue)
{
    Console.WriteLine($"Значение: {number.Value}"); // Безопасный доступ
}
else
{
    Console.WriteLine("Значение отсутствует");
}

Оператор объединения с null

Позволяет задать значение по умолчанию для Nullable-переменной:

int? nullableValue = null;
int result = nullableValue ?? 0; // Если nullableValue == null, то result = 0

Преобразования и приведение типов

Nullable-типы поддерживают неявные и явные преобразования:

int? a = 10;       // Неявное преобразование int в int?
int b = (int)a;    // Явное преобразование int? в int (если a == null — исключение)

Особенности работы с bool?

Для bool? существуют три возможных значения: true, false и null. Это полезно в логике троичной (трёхзначной) логики.

bool? isActive = null;

if (isActive == true)
{
    Console.WriteLine("Активен");
}
else if (isActive == false)
{
    Console.WriteLine("Неактивен");
}
else
{
    Console.WriteLine("Статус неизвестен");
}

Nullable-типы и базы данных

Особенно полезны при работе с базами данных, где поля могут содержать NULL:

// Пример с Entity Framework
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? Age { get; set; } // Поле может быть NULL в базе
}

Nullable Reference Types

Важно не путать Nullable-типы значений (int?) с Nullable Reference Types — фичей C# 8.0+, которая добавляет проверки на null для ссылочных типов.

#nullable enable
string nonNullableString = null; // Предупреждение компилятора
string? nullableString = null;  // Корректно

Резюмируем:


Nullable-типы — это мощный механизм C#, позволяющий типам-значениям работать с null. Они особенно полезны при взаимодействии с базами данных, API и в сценариях, где отсутствие значения — это валидное состояние. Правильное использование Nullable-типов делает код более выразительным и безопасным.