Nullable-тип (или "обнуляемый тип") — это структура в C#, которая позволяет типам-значениям (value types) принимать значение null
, что обычно невозможно для таких типов по умолчанию.
В C# типы-значения (int
, bool
, double
, struct
и т.д.) не могут быть null
— они всегда содержат какое-то значение по умолчанию (например, 0
для int
). Однако в реальных сценариях часто требуется явно обозначить отсутствие значения. Для этого и существуют Nullable-типы.
int number = null; // Ошибка компиляции: int не может быть null
int? nullableNumber = null; // Корректно: int? может быть null
Есть два способа объявления:
С использованием синтаксиса ?
(рекомендуемый способ)
int? nullableInt = null;
DateTime? nullableDate = null;
С использованием структуры Nullable<T>
Nullable<int> nullableInt = null;
Nullable<DateTime> nullableDate = null;
У Nullable-типов есть два важных свойства:
true
, если переменная содержит значение, и false
, если она null
.InvalidOperationException
).int? number = 42;
if (number.HasValue)
{
Console.WriteLine($"Значение: {number.Value}"); // Безопасный доступ
}
else
{
Console.WriteLine("Значение отсутствует");
}
Позволяет задать значение по умолчанию для 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?
существуют три возможных значения: true
, false
и null
. Это полезно в логике троичной (трёхзначной) логики.
bool? isActive = null;
if (isActive == true)
{
Console.WriteLine("Активен");
}
else if (isActive == false)
{
Console.WriteLine("Неактивен");
}
else
{
Console.WriteLine("Статус неизвестен");
}
Особенно полезны при работе с базами данных, где поля могут содержать NULL
:
// Пример с Entity Framework
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int? Age { get; set; } // Поле может быть NULL в базе
}
Важно не путать Nullable-типы значений (int?
) с Nullable Reference Types — фичей C# 8.0+, которая добавляет проверки на null
для ссылочных типов.
#nullable enable
string nonNullableString = null; // Предупреждение компилятора
string? nullableString = null; // Корректно
Nullable-типы — это мощный механизм C#, позволяющий типам-значениям работать с null
. Они особенно полезны при взаимодействии с базами данных, API и в сценариях, где отсутствие значения — это валидное состояние. Правильное использование Nullable-типов делает код более выразительным и безопасным.