0Pricing
C# Academy · Lekcja

Operatory null-conditional i null-coalescing

Łącz operatory ?., ?[], ?? i ??=, aby pisać zwięzły kod bezpieczny względem null bez rozwlekłych sprawdzeń null.

Operatory null-conditional i null-coalescing to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 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.

Wzorce kodu bezpiecznego dla wartości null

C# udostępnia trzy dedykowane operatory do zwięzłego obsługiwania wartości null: null-conditional (?., ?[]), null-coalescing (??) oraz null-coalescing assignment (??=). Razem eliminują większość rozwlekłego kodu sprawdzającego wartości null.

Operator null-conditional: ?.

?. zwraca null bez dalszego wykonywania, jeśli lewa strona ma wartość null, zamiast zgłaszać wyjątek NullReferenceException. Typ wyniku staje się nullable.

User? user = GetUser(id);

// Without ?.:
string? name = null;
if (user != null) name = user.Name;

// With ?.:
string? name2 = user?.Name;

// Chained:
string? city = user?.Address?.City;

// Method call:
string? upper = user?.Name?.ToUpper();

Operator null-conditional z indekserem: ?[]

?[] to operator indeksowania null-conditional. Umożliwia bezpieczny dostęp do elementów tablicy lub kolekcji, gdy sama kolekcja może mieć wartość null.

List<string>? tags = product?.Tags;

// Safe index access
string? firstTag = tags?[0];

// Null-conditional LINQ
int? count = tags?.Count;
bool? hasItems = tags?.Any();

// With methods:
string? joined = tags?.FirstOrDefault()?.ToUpper();

Operator null-coalescing: ??

?? zwraca lewy operand, jeśli nie ma on wartości null, a w przeciwnym razie zwraca prawy operand (wartość zastępczą). Jest zwięzłym odpowiednikiem x != null ? x : fallback.

string? name = GetName();

// Without ??:
string display = name != null ? name : "Anonymous";

// With ??:
string display2 = name ?? "Anonymous";

// Chaining ?? for multiple fallbacks:
string result = primary ?? secondary ?? tertiary ?? "Default";

// Combining with ?.
string city = user?.Address?.City ?? "Unknown City";

Przypisanie z operatorem null-coalescing: ??=

??= przypisuje prawe wyrażenie do zmiennej tylko wtedy, gdy zmienna ma obecnie wartość null. Operator ten doskonale sprawdza się we wzorcach leniwej inicjalizacji.

// Lazy initialization
private List<string>? _cache;

public List<string> GetCache()
{
    _cache ??= new List<string>(); // only assigns if null
    return _cache;
}

// Equivalent to:
// if (_cache is null) _cache = new List<string>();

// In-place:
string? name = null;
name ??= "Default";
Console.WriteLine(name); // "Default"

Używanie ?. ze zdarzeniami

Operator null-conditional to standardowy, bezpieczny wątkowo sposób wywoływania zdarzeń — eliminuje ryzyko wystąpienia wyścigu charakterystyczne dla osobnego sprawdzania wartości null i wywoływania zdarzenia.

public event EventHandler<DataEventArgs>? DataReceived;

// Thread-safe event invocation:
DataReceived?.Invoke(this, new DataEventArgs(data));

// This is equivalent to:
var handler = DataReceived;
if (handler != null) handler(this, new DataEventArgs(data));
// (local copy avoids race condition between check and invoke)

Złożone przykłady łańcuchowania

Łączenie operatorów umożliwia przejrzyste i czytelne, bezpieczne względem null poruszanie się po głęboko zagnieżdżonych grafach obiektów.

var order = GetOrder(id);

// Deeply nested with fallbacks:
string countryCode = order
    ?.Customer
    ?.ShippingAddress
    ?.Country
    ?.Code
    ?? "US";

// Collection safe access:
decimal firstLineTotal = order
    ?.Lines
    ?.FirstOrDefault()
    ?.Total
    ?? 0m;

// Method chain:
string? trackingUpper = order?.TrackingNumber?.ToUpper().Trim();

Operator null-conditional w LINQ

Operator null-conditional współpracuje bezproblemowo z LINQ, umożliwiając bezpieczne wykonywanie zapytań na kolekcjach lub właściwościach, które mogą mieć wartość null.

List<Order>? orders = customer?.Orders;

// Safe LINQ on a nullable collection:
var totalRevenue = orders?.Sum(o => o.Total) ?? 0m;
var pendingCount = orders?.Count(o => o.Status == OrderStatus.Pending) ?? 0;
var latest       = orders?.MaxBy(o => o.PlacedAt)?.Id;

Ochrona przed null za pomocą ThrowIfNull

W przypadku parametrów, które nie mogą mieć wartości null, należy użyć ArgumentNullException.ThrowIfNull() (.NET 6+) — zapewnia to zwięzłą i opisową walidację na wejściu do metody.

public void ProcessOrder(Order order, Customer customer)
{
    ArgumentNullException.ThrowIfNull(order);
    ArgumentNullException.ThrowIfNull(customer);

    // From this point, compiler knows both are non-null
    Console.WriteLine(order.Id);
    Console.WriteLine(customer.Name);
}

// .NET 7+: ArgumentException.ThrowIfNullOrEmpty
void Save(string name)
{
    ArgumentException.ThrowIfNullOrWhiteSpace(name);
    // name is guaranteed non-empty
}

Wzorzec is not null w switch

Dopasowywanie wzorców za pomocą is not null i is { } zapewnia przejrzyste wzorce sprawdzania wartości null, szczególnie w wyrażeniach switch.

string Describe(object? obj) => obj switch
{
    null                          => "nothing",
    string s when s.Length == 0  => "empty string",
    string s                      => $"string: {s}",
    int i                         => $"integer: {i}",
    { }                           => $"object: {obj.GetType().Name}"
};

// is not null in if statements:
if (order is not null && order.Customer is { Name: var name })
    Console.WriteLine(name);

Szybkie sprawdzenie

Co zwraca wyrażenie user?.Name ?? "Anonymous", gdy user ma wartość null?

Podsumowanie: Null-Conditional i Null-Coalescing

Najważniejsze informacje:

  • ?.: bezpieczny dostęp do składowej — zwraca null zamiast zgłaszać wyjątek, gdy odbiorca ma wartość null
  • ?[]: bezpieczny dostęp indeksowany do kolekcji, która może mieć wartość null
  • ??: wartość zastępcza, gdy lewy operand ma wartość null
  • ??=: przypisanie tylko wtedy, gdy wartość wynosi null — idealne rozwiązanie do leniwej inicjalizacji
  • Łączenie operatorów: a?.B?.C ?? defaultVal umożliwia bezpieczne względem null poruszanie się po głęboko zagnieżdżonych danych
  • ArgumentNullException.ThrowIfNull() służy do ochrony parametrów podczas walidacji

Często zadawane pytania

Czy lekcja „Operatory null-conditional i null-coalescing” jest bezpłatna?

Tak — pełny tekst „Operatory null-conditional i null-coalescing” 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 „Operatory null-conditional i null-coalescing”?

Łącz operatory ?., ?[], ?? i ??=, aby pisać zwięzły kod bezpieczny względem null bez rozwlekłych sprawdzeń null. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Operatory null-conditional i null-coalescing”?

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. Włączanie i poznawanie NRT
  2. Adnotacje: ?, !, MaybeNull i NotNull
  3. Operatory null-conditional i null-coalescing
  4. Migracja bazy kodu do NRT
← Powrót do C# Academy