0Pricing
C# Academy · Lekcja

Zabezpieczanie przed null

Walidacja i wzorce.

Zabezpieczanie przed null to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Dlaczego zabezpieczać się przed null?

Metoda, która otrzyma nieoczekiwaną wartość null, często kończy się później błędem NullReferenceException głęboko w stosie wywołań, co utrudnia ustalenie przyczyny.

Zabezpieczenie polega na sprawdzeniu argumentów na początku i jednoznacznym zgłoszeniu błędu, dzięki czemu wskazuje on bezpośrednio rzeczywistą przyczynę.

Klasyczne sprawdzanie wartości null

Najprostsze zabezpieczenie to jawne sprawdzenie, które zgłasza wyjątek ArgumentNullException, gdy wymagany argument ma wartość null.

W ten sposób dane wejściowe są sprawdzane na granicy metody, zanim rozpocznie się jakiekolwiek działanie.

void Save(string path)
{
    if (path == null)
        throw new System.ArgumentNullException(nameof(path));
    System.Console.WriteLine(path);
}

Używanie nameof

Należy przekazać nameof(path) zamiast zakodowanego na stałe ciągu znaków. Wyjątek poda wtedy dokładną nazwę parametru, a nazwa pozostanie poprawna również po zmianie nazwy parametru.

Znacznie ułatwia to debugowanie, gdy wyjątek jest zapisywany w logu.

void Greet(string user)
{
    if (user is null)
        throw new System.ArgumentNullException(nameof(user));
    System.Console.WriteLine("Hi " + user);
}

Pomocnicza metoda ThrowIfNull

Współczesny C# oferuje metodę ArgumentNullException.ThrowIfNull(arg). Sprawdza ona wartość null i automatycznie zgłasza wyjątek z poprawną nazwą parametru.

To zwięzły i preferowany styl zabezpieczania we współczesnym kodzie .NET.

void Process(object data)
{
    System.ArgumentNullException.ThrowIfNull(data);
    System.Console.WriteLine("Processing");
}

Działające zabezpieczenie

Ten program pokazuje zabezpieczenie, które przechwytuje argument o wartości null i zgłasza czytelny komunikat zamiast doprowadzać później do awarii.

Proszę go uruchomić, aby zobaczyć komunikat wyjątku zawierający nazwę nieprawidłowego parametru.

using System;

class Program
{
    static void Print(string text)
    {
        ArgumentNullException.ThrowIfNull(text);
        Console.WriteLine(text);
    }

    static void Main()
    {
        try { Print(null); }
        catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
    }
}

Zabezpieczenie za pomocą ?? throw

Można połączyć przypisanie i zabezpieczenie, używając ?? wraz z throw. Pozwala to sprawdzić wartość i zapisać ją w jednej linii.

To popularny wzorzec w konstruktorach podczas przypisywania wartości do pola.

class Service
{
    private readonly string _name;
    public Service(string name)
        => _name = name ?? throw new System.ArgumentNullException(nameof(name));
}

Pusty ciąg a null

W przypadku ciągów znaków null i pusty ciąg oznaczają różne problemy. Użycie string.IsNullOrEmpty lub string.IsNullOrWhiteSpace pozwala wykryć oba naraz.

Dla wartości pustej, ale niebędącej null, odpowiedni jest ArgumentException, a nie ArgumentNullException.

void SetName(string name)
{
    if (string.IsNullOrWhiteSpace(name))
        throw new System.ArgumentException("Name required", nameof(name));
}

Zabezpieczanie za pomocą wzorców

Wzorce is null i is not null są czytelne i nie można ich zmylić przez przeciążone operatory równości.

Jeśli typ może przeciążać operator ==, należy preferować is null zamiast == null.

object value = null;
if (value is null)
    System.Console.WriteLine("It is null");
if (value is not null)
    System.Console.WriteLine("Has value");

Wartość domyślna zamiast wyjątku

Nie każda wartość null oznacza błąd. Czasami rozsądna wartość domyślna jest lepsza niż wyjątek.

Należy używać ??, gdy null jest dopuszczalny, i zgłaszać wyjątek tylko wtedy, gdy wartość jest rzeczywiście wymagana.

string BuildPath(string folder)
{
    folder ??= "/tmp";
    return folder + "/file.txt";
}

Pomoc typów referencyjnych nullable

Po włączeniu typów referencyjnych nullable kompilator ostrzega, gdy może dojść do wyłuskania wartości, która może być null, dzięki czemu błędy są wykrywane przed uruchomieniem programu.

Deklaracja string jako typu niedopuszczającego null lub string? jako typu nullable dokumentuje zamiar programisty i pomaga analizatorowi.

#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);

Zabezpiecz, a następnie używaj bezpiecznie

Po zabezpieczeniu wartości na początku metody w dalszej części jej treści można używać jej bez powtarzania kontroli null.

Ten program najpierw wykonuje zabezpieczenie, a następnie bez obaw używa argumentu.

using System;

class Program
{
    static int Length(string s)
    {
        ArgumentNullException.ThrowIfNull(s);
        return s.Length;
    }

    static void Main()
    {
        Console.WriteLine(Length("hello"));
    }
}

Szybki test

Proszę sprawdzić, czy dobrze rozumieją Państwo zabezpieczanie przed wartościami null.

Podsumowanie

Wymagane argumenty należy zabezpieczać na początku metody. Do czytelnego zgłaszania błędów należy używać ArgumentNullException.ThrowIfNull lub ?? throw wraz z nameof.

W przypadku pustych ciągów należy używać string.IsNullOrWhiteSpace, do bezpiecznego sprawdzania — wzorców is null, a operatora ?? wtedy, gdy zamiast zgłaszania wyjątku dopuszczalna jest wartość domyślna.

Często zadawane pytania

Czy lekcja „Zabezpieczanie przed null” jest bezpłatna?

Tak — pełny tekst „Zabezpieczanie przed null” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zabezpieczanie przed null”?

Walidacja i wzorce. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Zabezpieczanie przed null”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Typy nullable reprezentujące wartości
  2. Operator null-conditional
  3. Operatory null-coalescing
  4. Zabezpieczanie przed null
← Powrót do C# Academy