0Pricing
C# Academy · Lekcja

Typy nullable reprezentujące wartości

int? i struktura Nullable.

Typy nullable reprezentujące wartości to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 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 typy wartości dopuszczające null?

Typy wartości, takie jak int, bool i DateTime, zawsze przechowują jakąś wartość. int ma domyślnie wartość 0, a nie „brak wartości”.

Czasami trzeba przedstawić brak danych, na przykład nieudzieloną odpowiedź w ankiecie lub pustą kolumnę w bazie danych. Typy wartości dopuszczające null umożliwiają przechowywanie przez typ wartości również null.

Deklarowanie za pomocą int?

Aby typ wartości dopuszczał null, należy dodać po nim znak ?. int? może przechowywać dowolną liczbę całkowitą albo null.

To najczęstszy sposób zapisywania typów wartości dopuszczających null w codziennym kodzie C#.

int? age = null;
int count = 5;
age = count;
System.Console.WriteLine(age);

Nullable<T> od środka

Składnia z użyciem ? jest skróconym zapisem. int? jest dokładnie tym samym typem co Nullable<int>.

Nullable<T> to struktura, która opakowuje typ wartości i dodaje znacznik informujący, czy wartość jest obecna.

Nullable<int> a = 10;
int? b = 10;
System.Console.WriteLine(a == b);

HasValue i Value

Każdy typ dopuszczający null udostępnia dwie właściwości. HasValue ma wartość true, gdy wartość jest obecna, a Value zwraca wartość bazową.

Odczyt Value, gdy HasValue ma wartość false, zgłasza wyjątek InvalidOperationException, dlatego najpierw należy to sprawdzić.

int? score = 42;
if (score.HasValue)
{
    System.Console.WriteLine(score.Value);
}

Kompletny przykład

Oto kompletny program. Przypisuje wartość, sprawdza HasValue i wyświetla wynik.

Należy go uruchomić, aby zobaczyć, jak zachowuje się typ dopuszczający null, gdy faktycznie przechowuje dane.

using System;

class Program
{
    static void Main()
    {
        int? temperature = 21;
        if (temperature.HasValue)
            Console.WriteLine("Temp: " + temperature.Value);
        else
            Console.WriteLine("No reading");
    }
}

Gdy wartość wynosi null

Przypisanie null powoduje, że HasValue zwraca false. Następnie wykonywana jest gałąź else.

Ten wzorzec pozwala bezpiecznie obsługiwać opcjonalne odczyty bez ryzyka awarii.

using System;

class Program
{
    static void Main()
    {
        int? temperature = null;
        if (temperature.HasValue)
            Console.WriteLine(temperature.Value);
        else
            Console.WriteLine("No reading");
    }
}

GetValueOrDefault

GetValueOrDefault() zwraca wartość, jeśli jest dostępna; w przeciwnym razie zwraca wartość domyślną dla danego typu (na przykład 0 dla int).

Można również przekazać własną wartość zastępczą: GetValueOrDefault(100) zwraca 100, gdy wartość wynosi null.

int? quantity = null;
int result = quantity.GetValueOrDefault(100);
System.Console.WriteLine(result);

Niejawna konwersja do typu nullable

Zwykły int jest automatycznie konwertowany na int?, ponieważ każda zwykła wartość jest również prawidłową wartością nullable.

Konwersja w drugą stronę nie odbywa się automatycznie: przejście z int? z powrotem do int wymaga jawnego rzutowania albo wartości zastępczej, ponieważ wartość nullable może być równa null.

int plain = 7;
int? wrapped = plain;
int back = (int)wrapped;
System.Console.WriteLine(back);

Typy nullable dla innych typów wartości

Działa to z każdym typem wartości: bool?, double?, DateTime?, a nawet z własnymi strukturami.

Typ bool? ma trzy stany: true, false i null, co jest przydatne w przypadku pytań, na które nie udzielono odpowiedzi „tak” ani „nie”.

bool? agreed = null;
double? price = 9.99;
System.Console.WriteLine(agreed.HasValue);
System.Console.WriteLine(price.Value);

Typy referencyjne już dopuszczają null

Klasy takie jak string i tablice mogą już przyjmować wartość null, dlatego nie potrzebują opakowania Nullable<T>.

Symbol ? przy typach referencyjnych, takich jak string?, oznacza coś innego: jest adnotacją nullable dla typu referencyjnego, a nie strukturą Nullable<T>.

Porównywanie typów nullable

Porównywanie działa, ale należy pamiętać, że null zachowuje się szczególnie. Dwie wartości null są równe, a dowolne uporządkowane porównanie z udziałem null zwraca false.

Dlatego null < 5 daje false, a null > 5 również daje false.

int? x = null;
System.Console.WriteLine(x < 5);
System.Console.WriteLine(x == null);

Szybki test

Proszę sprawdzić, czy dobrze rozumieją Państwo typy wartości nullable.

Podsumowanie

Typy wartości nullable pozwalają typom wartości przechowywać również null. Zapisuje się je jako int?, co jest równoważne Nullable<int>.

Do sprawdzania wartości należy używać HasValue, do jej odczytu — Value (tylko gdy wartość jest dostępna), a do bezpiecznego uzyskania wartości zastępczej — GetValueOrDefault(). Typy referencyjne z natury dopuszczają wartość null.

Często zadawane pytania

Czy lekcja „Typy nullable reprezentujące wartości” jest bezpłatna?

Tak — pełny tekst „Typy nullable reprezentujące wartości” 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 „Typy nullable reprezentujące wartości”?

int? i struktura Nullable. Ć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 1 z 4.

Ile czasu zajmuje lekcja „Typy nullable reprezentujące wartości”?

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