Operator null-conditional
Bezpieczny dostęp za pomocą ?..
Operator null-conditional to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 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.
Problem łańcuchów z null
Uzyskanie dostępu do składowej obiektu będącego referencją null zgłasza wyjątek NullReferenceException. To jeden z najczęstszych błędów czasu wykonywania w języku C#.
Gdy łączy się wywołania takie jak user.Address.City, dowolne ogniwo tego łańcucha może mieć wartość null, a dawnym rozwiązaniem była cała seria kontroli za pomocą if.
Poznaj ?.
Operator warunkowego dostępu ?. przerywa obliczanie całego wyrażenia. Jeśli lewa strona ma wartość null, wynikiem jest null, a nie wyjątek.
Można to rozumieć jako: „uzyskaj dostęp do tej składowej, ale tylko wtedy, gdy obiekt nie ma wartości null”.
string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);Wynik staje się nullable
Ponieważ ?. może zwrócić null, typ wyniku staje się nullable. Wyrażenie name?.Length ma typ int?, a nie int.
Dlatego należy przechowywać jego wynik w int?, a nie w zwykłym int.
string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);Działający przykład
Ten program pokazuje, że ?. zwraca wartość, gdy obiekt istnieje, oraz null, gdy go nie ma.
Proszę go uruchomić i zwrócić uwagę, że nigdy nie jest zgłaszany wyjątek.
using System;
class Program
{
static void Main()
{
string a = "world";
string b = null;
Console.WriteLine(a?.ToUpper());
Console.WriteLine(b?.ToUpper() ?? "(null)");
}
}Łączenie wielu operatorów ?.
Można łączyć ?. przy dostępie do wielu składowych. Gdy tylko dowolna część ma wartość null, cały łańcuch zostaje zatrzymany i zwraca null.
Dlatego customer?.Order?.Total jest bezpieczne, nawet jeśli customer lub Order ma wartość null.
string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);Indeksator warunkowego dostępu ?[]
W przypadku tablic i list dostępna jest forma indeksatora ?[]. Jeśli kolekcja ma wartość null, dostęp przez indeks zwraca null zamiast zgłaszać wyjątek.
Uwaga: operator zabezpiecza przed wartością null kolekcji, ale nie przed indeksem spoza zakresu.
int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);Bezpieczne wywoływanie metod
Operator ?. zabezpiecza również wywołania metod. list?.Clear() wywołuje Clear tylko wtedy, gdy list nie ma wartości null; w przeciwnym razie nic nie robi.
W przypadku metody zwracającej void całe wyrażenie po prostu nic nie robi, gdy obiekt ma wartość null.
System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");Bezpieczne dla wątków wywoływanie zdarzeń
Klasycznym zastosowaniem jest wywoływanie zdarzeń. SomeEvent?.Invoke(this, args) bezpiecznie wywołuje zdarzenie tylko wtedy, gdy jest zarejestrowany co najmniej jeden program obsługi.
Zastąpiło to dawny wzorzec sprawdzania wartości null, który mógł powodować wyścig między sprawdzeniem a wywołaniem.
System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");Łączenie z ??
?. naturalnie łączy się z operatorem null-coalescing ??, aby dostarczyć wartość zastępczą, gdy łańcuch ma wartość null.
name?.Length ?? 0 zwraca długość albo 0, jeśli name ma wartość null.
string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);Subtelna pułapka
Nawet gdy końcowy typ wartości nie dopuszcza null, użycie ?. sprawia, że wyrażenie staje się nullable. list?.Count ma typ int?, a nie int.
Jeśli potrzebny jest zwykły int, należy dodać ?? 0 albo użyć GetValueOrDefault().
var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);Pełne porównanie
Ten program zestawia rozwlekłe podejście z użyciem if ze zwięzłą wersją korzystającą z ?.. Oba rozwiązania unikają wyjątku, ale ?. jest znacznie czytelniejsze.
using System;
class Program
{
static void Main()
{
string s = null;
int len = s != null ? s.Length : -1;
Console.WriteLine(len);
Console.WriteLine(s?.Length ?? -1);
}
}Szybki test
Proszę sprawdzić, czy dobrze rozumieją Państwo operator warunkowego dostępu.
Podsumowanie
Operator warunkowego dostępu ?. (oraz indeksator ?[]) zatrzymuje dostęp do składowej, gdy obiekt ma wartość null, i zwraca null zamiast zgłaszać wyjątek.
Wynik staje się nullable, dlatego należy połączyć operator z ??, aby zapewnić wartość zastępczą.
Często zadawane pytania
Czy lekcja „Operator null-conditional” jest bezpłatna?
Tak — pełny tekst „Operator null-conditional” 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 „Operator null-conditional”?
Bezpieczny dostęp za pomocą ?.. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Operator null-conditional”?
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
- Typy nullable reprezentujące wartości
- Operator null-conditional
- Operatory null-coalescing
- Zabezpieczanie przed null