Обнуляемые типы

В программировании давно существует проблема, каким образом задать, что пе­ременной не присвоено никакого значения. Эта проблема решается разными способами. Один из способов заключается в том, чтобы присвоить переменной какое-либо значение, не входящее в диапазон допустимых для нее. Например, если величина может принимать только положительные значения, ей присваива­ется -1. Ясно, что для многих случаев этот подход неприменим. Другой способ — хранение логического признака, по которому можно определить, присвоено ли переменной значение. Этот способ не может использоваться, например, для зна­чений, возвращаемых из метода.

В версии С# 2.0 указанная проблема решается введением типов специального вида, называемых обнуляемыми (nullable). Обнуляемый тип представляет собой структуру, хранящую наряду со значением величины (свойство Value) логиче­ский признак, по которому можно определить, было ли присвоено значение этой величине (свойство HasValue).

Если значение величине было присвоено, свойство HasValue имеет значение true. Если значение величины равно null, свойство HasValue имеет значение false, а по­пытка получить значение через свойство Value вызывает генерацию исключения.

Обнуляемый тип строится на основе базового типа, за которым следует символ?, например:

int? х = 123;

int? у = null;

if (х.HasValue)

Console.WriteLine(x); // вместо х можно записать х.Value

if (y.HasValue)

Console.WriteLine(у);

Существуют явные и неявные преобразования из обнуляемых типов в обычные и обратно, при этом выполняется контроль возможности получения значения, например:

int i = 123;

int? x = i; // int --> int?

double? у = x; // int? --> double?

int? z = (int?)y; // double? --> int?

int j = (int) z; // int? --> int

Для величин обнуляемых типов определены операции отношения. Операции == и!= возвращают значение true, если обе величины имеют значение null. Естест­венно, что значение null считается не равным любому ненулевому значению. Операции <, >, <= и >= дают в результате false, если хотя бы один из операндов имеет значение null.

Арифметические операции с величинами обнуляемых типов дают в результате null, если хотя бы один из операндов равен null, например:

int? х = null;

int? у = х + 1; // у = null

Для величин обнуляемых типов введена еще одна операция — объединения?? (null coalescing operator). Это бинарная операция, результат которой равен пер­вому операнду, если он не равен null, и второму в противном случае. Иными словами, эта операция предоставляет замещаемое значение для null, например:

int? х = null;

int у = х?? 0; // y = 0

х = 1;

у = х?? 0; // y = 1

Обнуляемые типы удобно использовать при работе с базами данных и XML.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: