null
У C# літерал null позначає відсутність значення. Типом, що допускає null, називають тип, значення якого можуть бути null.
До C# 8.0 типи посилань завжди допускали null, а типи значень ні. Тип значень можна зробити таким, що допускає null, додавши до нього знак питання (?).
string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable
int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable
int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable
Звернення до члена змінної зі значенням null не спричиняє помилки компіляції, але під час виконання призводить до викидання NullReferenceException:
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
Щоб зарадити цій поширеній помилці, C# 8 дає змогу увімкнути можливість, яка типово робить типи посилань такими, що не допускають null:
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
Щоб безпечно працювати зі значеннями, що допускають null, перевірмо, чи вони не null, перш ніж їх використовувати:
string NormalizedName(string? name)
{
if (name == null)
{
return "UNKNOWN";
}
// Value is not null at this point, so no compile warning
// and no runtime NullReferenceException being thrown
return name.ToUpper();
}
NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"
Оператор ?? дає змогу повернути типове значення, коли значення null:
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
Оператор ?. дає змогу безпечно викликати члени у значення, яке може бути null:
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
У цій вправі ми писатимемо код, який друкує бейджі з іменами для працівників фабрики.
У працівників є ідентифікатор, імʼя та назва відділу. Написи на бейджах працівників мають такий формат: "[id] - name - DEPARTMENT". Реалізуйте (статичний) метод Badge.Print(), щоб він повертав напис на бейджі працівника:
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
Зауважимо, що назву відділу в написі слід писати великими літерами.
Через особливість компʼютерної системи нові працівники, починаючи роботу на фабриці, іноді ще не мають ідентифікатора. Оскільки бейджі обовʼязкові, вони отримують тимчасовий бейдж без префікса з ідентифікатором. Змініть (статичний) метод Badge.Print(), щоб він підтримував нових працівників, які ще не мають ідентифікатора:
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
Навіть власник фабрики мусить весь час носити бейдж. Однак у власника немає відділу. У цьому випадку в написі замість назви відділу потрібно надрукувати "OWNER". Змініть (статичний) метод Badge.Print(), щоб він друкував напис для власника:
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
Зауважимо, що власник може бути також і новим працівником:
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.