Урок 12. Числовые типы данных C#, допускающие значение NULL


Все уроки по C# расположены здесь.

В этой статье мы исследуем понятие неопределенных или допускающих значение NULL данных и типов данных, введенных как часть .NET 2.0, которые позволяют хранение null информации.

Когда программа работает с числовой информацией, особенно при извлечении из базы данных, значение может быть неопределенным. Например, когда задается ряд простых вопросов да/нет, и результат каждого вопроса хранится в типе Boolean. После ответа на вопрос значение может быть true или false для указания результата. Однако, прежде чем дать ответ, что должно держать значение? Ответ - null.

Числовые типы данных, допускающие значение NULL

Null используется для представления неопределенного значения. Когда в C# изначально был создан, значение NULL существовало, но не могло быть применено к числовым переменным. В C# 2.0 базовые типы данных имеют эквиваленты, допускающие значение NULL. Есть несколько способов, чтобы объявить переменную как значение null. Самое простое-добавить знак вопроса (?) к типу. В следующем примере показаны объявление и присвоение нескольких переменных, допускающих значение NULL

int? nullableInt;
int? nullValue = null;
int? notNull = 123;
 
bool? answer1 = true;
bool? answer2 = false;
bool? answer3 = null;
Вы можете видеть, что создание переменной, допускающей значение NULL, аналогично созданию стандартной числовой переменной. Как и для других числовых типов, перед использованием переменной необходимо назначить значение, даже если это значение равно null. Следующий код вызывает ошибку при попытке его компиляции.

int? nullableInt;
int? copy = nullableInt;    // Ошибка, переменная не назначена
Преобразование типов данных

Числовое значение типа данных null позволяет явное и неявное преобразование между различными размерами обнуляемого целого типа и с плавающей запятой. Значения также могут быть преобразованы между их nullable и не nullable версиями. Преобразование между двумя типами несовместимого размера требует инструкции cast, как и приведение из типа, допускающего значение NULL, в тип, не допускающий значения NULL.

int standardInteger = 123;
int? nullableInteger;
decimal standardDecimal = 12.34M;
 
// Неявное преобразование из int в int?
nullableInteger = standardInteger;
 
// Неявное преобразование из int? в int
standardInteger = (int)nullableInteger;
 
// Неявное преобразование из decimal в int?
nullableInteger = (int?)standardDecimal;
При приведении значения NULL в тип данных, не допускающего значения NULL, необходимо соблюдать осторожность. Если значение равно null, произойдет, то будет выброшено исключение во время выполнения. Этого можно избежать, проверив null перед попыткой преобразования.

Арифметические операторы

Стандартные арифметические операторы могут использоваться с типами nullable типов. Если значение любого из операндов равно null, результат будет null независимо от других значений.

int? a = 55;
int? n = null;
int? result;
 
result = a * 2;         // result = 110
result = a * n;         // result = null
Логический оператор

При использовании nullable в булевских переменным стандартные бинарные логические операторы могут быть использованы. Если оба операнда используются либо true, либо false, то результаты операции такие же, как и для недопустимых булевых значений. Где один или оба операнда имеют значение NULL, то результат обычно нулевой. Есть два особых случая, когда этого не происходит. В логической операции OR если любое значение равно true, результат равен true, даже если другой операнд имеет значение null. Для логических AND операций если любое значение равно false, результат будет false.

bool? result;
 
result = true & null;       // result = null
result = false & null;      // result = false
 
result = true | null;       // result = true
result = false | null;      // result = null
 
result = true ^ null;       // result = null
result = false ^ null;      // result = null
Реляционные операторы

Реляционные операторы являются допустимыми для использования с nullable числовыми типами. Если сравниваемое значение равно null, результаты не всегда будут такими, как ожидалось. Операторы равно и не равно имеют возможность сравнивать как числовые, так и нулевые значения. Для всех остальных реляционных операторов результатом сравнения является значение false , когда значение сравнивается с null.

int? a = 55;
int? n = null;
bool result;
 
result = a == n;        // result = false
result = a != n;        // result = true
result = n == null;     // result = true
 
result = a > n;         // result = false
result = a < n;         // result = false
Проверка значений Null

В предыдущем разделе показано использование реляционных операторов с типами, допускающими значение NULL. В примерах вы можете увидеть, что можно использовать операторы равно или не равно, чтобы проверить равно ли значение переменной null (извиняюсь за тавтологию). Кроме того, nullable типы данных имеют несколько свойств и методов для проверки, является ли значение null, и для получения значения, где это не так.

Свойство HasValue

Первое свойство, представляющее интерес - это hasvalue. Возвращает логическое значение, указывающее, содержит ли переменная значение или null. Чтобы получить доступ к значению свойства, используется оператор доступа. Это точка между именем переменной и именем элемента (свойства или метода), который будет использоваться. В следующем примере показано свойство HasValue, используемое для задания значения, не допускающего значения NULL, на значение типа NULL со значением по умолчанию, равным -1, если переменная NULL не имеет значения.

int? a = 10;
int? n = null;
int result;
bool checkIfNull;
 
checkIfNull = a.HasValue;               // checkIfNull = true
result = checkIfNull ? (int)a : -1;     // result = 10
 
checkIfNull = n.HasValue;               // checkIfNull = false
result = checkIfNull ? (int)n : -1;     // result = -1
Свойство value

Числовые типы данных C#, допускающие значение NULL включают в себя второе свойство, называемое значение, которое может использоваться, чтобы получить значение из переменной, как необнуляемый тип. Это обеспечивает тот же эффект, что и приведение от типа, допускающего значение NULL, к его аналогу, не допускающему значения NULL. Как и в случае с приведением, во время выполнения будет возникать ошибка, если значение переменной будет null. Поэтому предыдущий пример может быть написан следующим образом

int? a = 10;
int? n = null;
int result;
bool checkIfNull;
 
checkIfNull = a.HasValue;               // checkIfNull = true
result = checkIfNull ? a.Value : -1;    // result = 10
 
checkIfNull = n.HasValue;               // checkIfNull = false
result = checkIfNull ? n.Value : -1;    // result = -1
 
result = n.Value;                       // Это приведет к ошибке во время выполнения.
Метод GetValueOrDefault

GetValueOrDefault метод доступен для всех числовых типов данных, которые допускают значения null. Он предоставляет все функциональные возможности предыдущего примера в одном операторе. Метод может быть вызван двумя способами. При использовании без параметра возвращается числовое значение данных, допускающих значение NULL. Если рассматриваемая переменная имеет значение null, вместо нее возвращается ноль. Второй способ вызвать метод - использовать параметр. Как и у всех методов, параметр расположен в скобках. Используйте пустую пару скобок для вызова без параметров.

int? a = 10;
int? n = null;
int result;
 
result = a.GetValueOrDefault();         // result = 10
 
result = n.GetValueOrDefault();         // result = 0
result = n.GetValueOrDefault(-1);       // result = -1
Оператор NULL Coalescing (??)

NULL Coalescing оператор проверяет, равно ли значение переменной null. Если значение не равно null, возвращается его значение. Если значение равно null, возвращается значение замены, указанное в качестве второго операнда. Оператор предоставляет аналогичную функциональность методу GetValueOrDefault с тем преимуществом, что его можно использовать для типов, которые не предоставляют эту функциональность. Символом оператора является двойной вопросительный знак (??).

int? a = 10;
int? n = null;
int result;
 
result = a ?? -1;     // result = 10
result = n ?? -1;     // result = -1
Предыдущий: Урок 11. Операторы сравнения в C# | Урок 13. Символьный тип данных (char) C#
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, Уроки по си шарп, си шарп, операторы, .net




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 8. Циклы: for, while и do while
Рисование дуги на C#
Что такое диод и для чего он используется?