Значення null. Типи даних, допускаючих значення null. Операції ?, ??
Зміст
- 1. Значення null. Присвоєння
- 2. Синтаксис типу даних, який допускає значення null. Суфікс ?
- 3. Приклади використання значень null у змінних базових типів
- 4. Суфікс ? і структура System.Nullable<T>. Призначення. Приклад
- 5. Як програмно визначити, чи Nullable-змінній було присвоєне значення null?
- 6. Операція ??. Призначення. Приклад
- Зв’язані теми
Пошук на інших ресурсах:
1. Значення null. Присвоєння
Значення null використовується для представлення пустого посилання на об’єкт. Це значення може бути присвоєне змінним посилальних типів.
Приклад.
У прикладі продемонстровано присвоювання null-значення посиланням на об’єкти класів CMyClass та string. Якщо спробувати присвоїти значення null змінній типу int, то компілятор видасть повідомлення про помилку.
class CMyClass { public int value; } class Program { static void Main(string[] args) { CMyClass obj; obj = null; // пусте посилання на об'єкт класу CMyClass string s = null; // пусте посилання на рядок // int d = null; - помилка: тип int не є null-типом Console.ReadKey(); } }
⇑
2. Синтаксис типу даних, який допускає значення null. Суфікс ?
У мові програмування C# усі базові числові типи даних (int, float, double, bool та інші) є типами-значеннями. Цим типам ніколи не може бути присвоєне значення null. Значення null може присвоюватись змінним посилальних типів, якими є класи.
Існують випадки, коли потрібно щоб тип-значення допускав null. Наприклад, в таблицях баз даних при деяких умовах можуть бути поля, що містять невизначені null-значення.
Для того, щоб тип-значення міг підтримувати null, в C# використовується наступна загальна форма, що містить символ ?
type? variable;
де
- type – тип-значення, який повинен допускати значення null;
- variable – назва змінної, якій може бути присвоєне значення null.
⇑
3. Приклади використання значень null у змінних базових типів
... // Nullable-типи // Це є помилка // int d = null; // помилка - d не є Nullable-тип // Так працює int? d2 = null; double? x; x = 25; x = null; bool? b; b = true; b = null; float? f; f = null; ...
⇑
4. Суфікс ? і структура System.Nullable<T>. Призначення. Приклад
Якщо компілятор після імені типу зустрічає суфікс ?, то він створює екземпляр узагальненої структури System.Nullable<T>.
Структура System.Nullable<T> забезпечує додатковий набір засобів, що працюють з типами які допускають значення null. До цих засобів можна віднести:
- властивість HasValue. Ця властивість визначає, чи поточний об’єкт типу System.Nullable<T> має стійке значення типу T (тут замість типу T задається будь-який базовий тип int, double і т.д.). Властивість повертає true, якщо поточний об’єкт має таке значення, в противному випадку повертається false (див. приклад нижче). Іншими словами, властивість HasValue повертає false, якщо значення об’єкту рівне null;
- властивість Value – повертає поточне значення, яке присвоєне змінній типу, що допускає null;
- метод GetValueOrDefault(). Якщо Nullable-змінна має значення не рівне null, то цей метод повертає це значення. Якщо Nullable-змінна рівна null, то метод повертає значення за замовчуванням (як правило це 0). Цей метод потрібно використовувати для коректного присвоювання значення з Nullable-типу у звичайний базовий тип.
Приклад.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { class Program { static void Main(string[] args) { // 1. Оголошення змінної типу System.Nullable<int> System.Nullable<int> d; // можна було й так: int? d; // 2. Оголошення змінної типу System.Nullable<double> double? t = null; // 3. Властивість Value - демонстрація правильного присвоєння // тип int? d = null; int d2; // не Nullable-тип if (d == null) d2 = 0; else d2 = d.Value; // d2 = 335 // тип double? t = -10.55; double t2; if (t != null) t2 = t.Value; // t2 = -10.55 else t2 = 0.0; // 4. Властивість HasValue // Перевірка, чи змінна t рівна null t = null; if (t.HasValue) Console.WriteLine("t != null"); else Console.WriteLine("t == null"); // 5. Метод GetValueOrDefault() - не потрібно робити перевірку на null t = null; double t3 = t.GetValueOrDefault(); // t3 = 0 - значення за замовчуванням Console.WriteLine("d2 = {0}", d2); Console.WriteLine("t2 = {0}", t2); Console.WriteLine("t3 = {0}", t3); Console.ReadKey(); } } }
Результат виконання програми
t == null d2 = 0 t2 = -10.55 t3 = 0
⇑
5. Як програмно визначити, чи Nullable-змінній було присвоєне значення null?
Якщо змінна допускає null, то визначити, чи містить ця змінна значення null можна наступними способами:
- використати одну з операцій == або !=;
- використати властивість HasValue.
Приклад.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { class Program { static void Main(string[] args) { // Перевірка, чи Nullable-змінній було присвоєне значення null char? symbol; // деяка Nullable-змінна // Спосіб 1. Операція == symbol = null; if (symbol == null) Console.WriteLine("symbol == null"); else Console.WriteLine("symbol != null"); // Спосіб 2. Операція != symbol = 'a'; if (symbol != null) Console.WriteLine("symbol != null"); else Console.WriteLine("symbol == null"); // Спосіб 3. Властивість HasValue symbol = null; if (symbol.HasValue) Console.WriteLine("symbol != null"); else Console.WriteLine("symbol == null"); Console.ReadKey(); } } }
Результат роботи програми
symbol == null symbol != null symbol == null
⇑
6. Операція ??. Призначення. Приклад
Операція ?? дозволяє присвоювати об’єкту Nullable-типу задане значення у випадку, коли значення цього об’єкту рівне null. Операція дозволяє замінити програмний код, що використовує конструкцію if-else. Порівняно з if-else ця операція є більш компактною.
Приклад.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { class Program { static void Main(string[] args) { // Операція ?? uint? d; // деякий Nullable-тип uint? t; d = null; t = d ?? 50; // t = 50 Console.WriteLine("t = {0}", t); d = 20; t = d ?? 50; // t = 20 Console.WriteLine("t = {0}", t); Console.ReadKey(); } } }
Результат роботи програми
t = 50 t = 20
⇑
Зв’язані теми
- Категорії (групи) типів даних у C#. Типи-значення. Посилальні типи
- Базові типи даних мови C#. Приклади
⇑