Operator Null-Conditional w C#
W jednym ze swoich filmów Gerald Versluis napotkał pytanie dotyczące znaku zapytania (?) w jego przykładowym kodzie. To skłoniło go do stworzenia szczegółowego filmu wyjaśniającego operatora null-conditional w C#. Jesli kiedykolwiek zastanawiales sie, co ?. lub ?[ ] robi w C#, wideo Geralda to doskonaly zasob, aby to zrozumiec jasno. Przejdźmy przez jego wyjaśnienie krok po kroku.
Szybkie wyjaśnienie przez stronę dokumentacji
Gerald zaczyna od odniesienia do oficjalnej dokumentacji Microsoft na temat operatorów dostępu do członków i wyrażeń. Podkreśla sekcję dotyczącą operatora null-conditional, wprowadzonego w C# 6. W momencie nagrywania C# 9 był najnowszą wersją, z C# 10 na horyzoncie.
Gerald wyjasnia, ze gdy uzywasz a?.x lub a?[index], jezeli a jest nullem, cale wyrazenie ocenia sie jako null zamiast powodowac NullReferenceException. W przeciwnym razie pobiera wartość normalnie.
Chociaż dokumentacja jest pomocna, Gerald preferuje praktyczne przykłady, więc przechodzi do interaktywnego środowiska kodowania.
Przykład przez try.dot.net
Aby zademonstrować, Gerald przechodzi do try.dot.net, interaktywnego środowiska C#. Wspomina, że to narzędzie działa na Blazor, umożliwiając użytkownikom wykonywanie kodu C# bezpośrednio w przeglądarce.
Krótko pokazuje domyślny przykład ciągu Fibonacciego, który jest wstępnie załadowany w try.dot.net, a następnie czyści go, aby zacząć nowy przykład koncentrujący się na operatorze null-conditional.
Operatorzy null-conditional wyjaśnieni
Gerald tworzy prostą klasę Person z następującymi właściwościami:
public class Person
{
// The Name property of the Person
public string Name { get; set; }
// A reference to another Person object representing the partner
public Person Partner { get; set; }
// An array representing the Person's hobbies
public string[] Hobbies { get; set; }
}
public class Person
{
// The Name property of the Person
public string Name { get; set; }
// A reference to another Person object representing the partner
public Person Partner { get; set; }
// An array representing the Person's hobbies
public string[] Hobbies { get; set; }
}
Inicjalizuje obiekt Person jako null:
// Initialize a Person object as null
Person person = null;
// Attempting to access a property of a null object will throw a NullReferenceException
Console.WriteLine(person.Name);
// Initialize a Person object as null
Person person = null;
// Attempting to access a property of a null object will throw a NullReferenceException
Console.WriteLine(person.Name);
Uruchomienie tego kodu rzuca NullReferenceException, poniewaz person jest null. Aby temu zapobiec, programiści zazwyczaj dodają kontrolę przed dostępem do właściwości:
// Check if the person object is not null before accessing its properties
if (person != null)
{
Console.WriteLine(person.Name);
}
// Check if the person object is not null before accessing its properties
if (person != null)
{
Console.WriteLine(person.Name);
}
Chociaż to działa, wprowadza dodatkowe linie kodu. Gerald wyjaśnia, jak operator null-conditional to upraszcza:
// Using the null-conditional operator to safely access the Name property
Console.WriteLine(person?.Name);
// Using the null-conditional operator to safely access the Name property
Console.WriteLine(person?.Name);
Teraz, jezeli person jest null, wyrazenie po prostu zwraca null zamiast sie zawiesic.
Operator null-conditional na właściwości
Gerald rozszerza przyklad, ustawiajac obiekt Person:
// Create a new Person object
Person person = new Person { Name = "Gerald" };
// Access the Name property safely
Console.WriteLine(person?.Name);
// Create a new Person object
Person person = new Person { Name = "Gerald" };
// Access the Name property safely
Console.WriteLine(person?.Name);
Poniewaz person nie jest null, poprawnie drukuje "Gerald".
Następnie pokazuje zagnieżdżony przykład:
// Safely access the Name property of the Partner object
Console.WriteLine(person?.Partner?.Name);
// Safely access the Name property of the Partner object
Console.WriteLine(person?.Partner?.Name);
Jesli person.Partner jest null, cale wyrazenie ocenia sie jako null zamiast rzucac wyjatek. To unika niepotrzebnych warunków if.
Łączenie operatorów null-conditional
Gerald wyjaśnia, że operatory null-conditional mogą być łączone, co sprawia, że kod jest czytelniejszy przy pracy z głęboko zagnieżdżonymi obiektami. Zamiast pisać wiele kontroli null, można użyć:
// Chain null-conditional operators to safely access nested objects
Console.WriteLine(person?.Partner?.Name);
// Chain null-conditional operators to safely access nested objects
Console.WriteLine(person?.Partner?.Name);
Jesli person lub person.Partner jest null, wynik bedzie null, co zapobiega bledom w czasie wykonywania.
Operatorzy null-conditional na tablicach
Gerald rozszerza dyskusję na tablice i kolekcje. Dodaje tablicę Hobbies do klasy Person i pokazuje, jak bezpiecznie uzyskiwać dostęp do elementów:
// Safely access the first element of the Hobbies array
Console.WriteLine(person?.Hobbies?[0]);
// Safely access the first element of the Hobbies array
Console.WriteLine(person?.Hobbies?[0]);
Tutaj, jesli person lub Hobbies jest null, wyrazenie ocenia sie jako null zamiast powodowac wyjatek.
Wnioski
Film Geralda dostarcza dogłębnego spojrzenia na operator null-conditional w C#. Uzywajac ?. i ?[ ], programisci moga pisac czystszy, bezpieczniejszy kod, ktory unika NullReferenceException. Niezależnie od pracy z właściwościami, zagnieżdżonymi obiektami czy tablicami, operator null-conditional sprawia, że kod jest bardziej zwięzły i czytelny.
Aby zobaczyć całą demonstrację, koniecznie obejrzyj film Geralda Versluisa, w którym wszystko wyjaśnia na praktycznych przykładach!
