День сорок первый. #ЗаметкиНаПолях

Nullable-типы

Иногда бывают ситуации, когда необходимо чтобы тип значений мог принимать null, и это можно сделать, указав знак вопроса ? после имени типа, при объявлении переменной:

int? a = 5;

double? b = null;

bool? c = false;

Nullable-типы могут пригодиться при работе с базой данных. Некоторые поля таблицы базы данных могут принимать значение null.

Запись ? является упрощенной формой использования структуры System.Nullable<T>:

[System.Serializable]

public struct Nullable<T> where T : struct

Следующие виды определения переменных будут эквивалентны предыдущим:

Nullable<int> a = 5;

Nullable<double> b = null;

Nullable<bool> c = false;



Операторы

Любые операторы, которые определены для значимых типов, также могут быть использованы для nullable-типов. Эти операторы вернут null, если один или оба операнда null. В противном случае операторы используют содержащиеся значения для расчёта результата. Например:

int? a = 10;

int? b = null;

int? c = 10;

a++; // a = 11

a = a * c; // a = 110

a = a + b; // a = null

Для операторов сравнения (<, >, <=, >=), если один или оба операнда null, результатом будет ложь. Не рассчитывайте на то, что, если определённое сравнение (например, <=) возвращает ложь, то обратное сравнение (>) вернёт правду! Например, 10:

- не больше и не равно null,

- также и не меньше null.



Оператор ?? (null-объединение)

Оператор null-объединения ?? похож на тернарный оператор. Он имеет следующую структуру:

[операнд1] ?? [операнд2];

??
возвращает операнд1, если тот не равен значению null, иначе возвращает операнд2.

int? a = 1;

int? b = null;

Console.WriteLine(a ?? 3); // 1

Console.WriteLine(b ?? 3); // 3

Левый операнд, который сравнивается со значением null, обязательно должен быть nullable-типа, иначе возникнет ошибка компиляции.



Источники:

-
http://mycsharp.ru/post/47/2014_09_30_znachenie_null_nullable-tipy_operator___.html

-
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/nullable-types/using-nullable-types