Operator Null-Conditional w C#
[[academy-video-youtube({"vid": "eOpmjGF4qxo", "start_time": "0", "title": "C# Null-Conditional Operator (?", "creator": "Gerald Versluis", "length": "13m 26s"})]] Operator) Wyjaśniony!
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 jest doskonalym zrodlem do jasnego zrozumienia tego. 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], jesli a jest null, cale wyrazenie zwraca null zamiast rzucic 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 on 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 wyrzuca 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, jesli person jest null, wyrazenie po prostu zwraca null zamiast spowodowac awarie.
Operator null-conditional na właściwości
Gerald rozszerza przyklad poprzez ustawienie obiektu 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 wyswietla "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 zwraca null zamiast spowodowac 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 wykonania.
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 zwraca null zamiast spowodowac wyjatek.
Wnioski
Film Geralda dostarcza dogłębnego spojrzenia na operator null-conditional w C#. Uzywajac ?. i ?[ ], deweloperzy 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!

