Треки
/
C#
C#
/
Вправи
/
Тім із маркетингу
Тім із маркетингу

Тім із маркетингу

Навчальна вправа

Вступ

Допустимість 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

Вказівки

У цій вправі ми писатимемо код, який друкує бейджі з іменами для працівників фабрики.

1. Надрукувати бейдж для працівника

У працівників є ідентифікатор, імʼя та назва відділу. Написи на бейджах працівників мають такий формат: "[id] - name - DEPARTMENT". Реалізуйте (статичний) метод Badge.Print(), щоб він повертав напис на бейджі працівника:

Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"

Зауважимо, що назву відділу в написі слід писати великими літерами.

2. Надрукувати бейдж для нового працівника

Через особливість компʼютерної системи нові працівники, починаючи роботу на фабриці, іноді ще не мають ідентифікатора. Оскільки бейджі обовʼязкові, вони отримують тимчасовий бейдж без префікса з ідентифікатором. Змініть (статичний) метод Badge.Print(), щоб він підтримував нових працівників, які ще не мають ідентифікатора:

Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"

3. Надрукувати бейдж для власника

Навіть власник фабрики мусить весь час носити бейдж. Однак у власника немає відділу. У цьому випадку в написі замість назви відділу потрібно надрукувати "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"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
C# Exercism

Час розпочати Тім із маркетингу?

Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.