Типи посилання і типи значень, які розглядалися в попередньому уроці, мають ще одну відмінність.Типи посилання можуть приймати значення null, типи значень - ні.
Null вказує на те, що значення невідомо, чи, іншими словами, значення немає.
Значення null ви вже зустрічали, думаю, не раз. Наприклад, коли оголошували масив і намагалися працювати з ним, не створивши його за допомогою оператора new. Таке посилання (ім'я) мала значення null, і видавався виняток NullReferenceException.
Іноді новачки в програмуванні можуть сприймати null як число 0 (нуль), але це зовсім не так. Число нуль цілком інформативне значення, null ж говорить нам про те, що значення немає.
Нижче в прикладі показано, що для типу посилання ми можемо поставити null, а для типу значень ні:
static void Main(string[] args)
{
Object a = null; // нормально
int b = null; // помилка, int не nullable тип
}
Nullable-типи
Іноді бувають ситуації, коли необхідно щоб тип значень міг приймати null, і це можна зробити, вказавши знак питання (?) Після імені типу, при оголошенні змінної:
static void Main(string[] args)
{
int? a = null;
double? b = null;
bool? c = null;
}
Nullable-типи можуть стати в нагоді при роботі з базою даних. Деякі поля таблиці бази даних можуть приймати значення null. Наприклад, значення булевого поля чи любить людина котів може залишатися невідомим. Або більш практичний приклад. На головній сторінці цього сайту є стрічка з уроками, і в ній кілька останніх, інші на сторінках 2,3, ... Номер сторінки передається аргументом в http запиті ( "...? Page = 2"), але для першого заходу на сайт сторінку 1 вказувати в запиті не дуже красиво, використовуючи nullable-тип, змінна int, яка відповідає за номер сторінки, в такому випадку приймає значення null.
Оператор ?? (Null-об'єднання)
Оператор null-об'єднання ?? трохи схожий на тернарний оператор. Він має наступну структуру:
[операнд1] ?? [операнд2];
?? повертає операнд1 в разі якщо той не дорівнює значенню null, інакше повертає операнд2.
static void Main(string[] args)
{
int? a = 1;
int? b = null;
Console.WriteLine(a ?? 3); // 1
Console.WriteLine(b ?? 3); // 3
Console.ReadLine();
}
Лівий операнд, який порівнюється зі значенням null, обов'язково повинен бути nullable-типу, інакше отримаємо помилку "Operator '??' can not be applied to operands of type 'int' and 'int' ".
Домашнє завдання
Створіть метод, який буде виводити інформацію про кількість дітей у людини. Метод приймає ім'я людини і кількість (nullable). Метод повинен виводити: невідомо, немає дітей і повідомлення про кількість дітей.