C# Academy · Lekcja

Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6)

C# 6 nie obsługuje typów referencyjnych dopuszczających null (string?). Proszę nauczyć się bezpiecznej obsługi wartości null: sprawdzania danych wejściowych, przejrzystej dokumentacji, pomocnika Require.NotNull oraz różnic w porównaniu z Nullable dla typów wartości.

Lekcja 3 z 38 kroki

Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6) to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 3. 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 3 lekcji w sumie.

NRT i rozwiązanie zastępcze

Idea: Typy referencyjne dopuszczające wartość null (np. string?) dodają sprawdzanie przez kompilator w nowszych wersjach C#.

  • C# 6 nie obsługuje string?
  • Używaj kontroli, jasnej dokumentacji i prostych metod pomocniczych
  • Domyślnie zwracaj wartości inne niż null

Zabezpieczanie przed null

Dodawaj kontrole ArgumentNullException dla parametrów typów referencyjnych, a następnie traktuj wartości jako inne niż null.

using System;

public static class Greeter
{
  // Contract: name must not be null (C# 6 has no string? to enforce)
  public static string Hello(string name)
  {
    if (name == null) throw new ArgumentNullException("name"); // guard
    return "Hello " + name.ToUpper(); // safe after guard
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(Greeter.Hello("Ada"));
    try
    {
      Console.WriteLine(Greeter.Hello(null)); // will throw (by design)
    }
    catch (Exception ex)
    {
      Console.WriteLine("Caught: " + ex.GetType().Name);
    }
  }
}

Metoda pomocnicza Require.NotNull

Utwórz niewielką metodę pomocniczą Require.NotNull, aby ograniczyć powtarzalny kod i jasno wyrazić intencję.

using System;

public static class Require
{
  // Works for reference types; returns the validated value
  public static T NotNull<T>(T value, string name) where T : class
  {
    if (value == null) throw new ArgumentNullException(name);
    return value;
  }
}

public sealed class Email
{
  public string Address { get; private set; }

  public Email(string address)
  {
    Address = Require.NotNull(address, "address").Trim();
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Email e = new Email("user@mail.com");
    Console.WriteLine(e.Address);
  }
}

Nullable<T> a typy referencyjne

Nullable<T> (np. int?) służy do obsługi typów wartości. Typy referencyjne już mogą mieć wartość null, dlatego w C# 6 stosujemy kontrole.

using System;

public class Program
{
  public static void Main(string[] args)
  {
    int x = 5;              // value type (non-nullable)
    int? maybe = null;      // Nullable<T> works for value types
    Console.WriteLine("x=" + x);
    Console.WriteLine("maybe has value? " + maybe.HasValue);
    Console.WriteLine("maybe or default: " + (maybe ?? -1));
  }
}

Dokumentowanie kontraktów dotyczących null

Określaj możliwość wystąpienia null w dokumentacji XML i zachowuj spójność: albo zawsze zwracaj wartości inne niż null, albo jasno dokumentuj sytuacje, w których null jest możliwe.

using System;

/// <summary>
/// Parses "key=value" and returns the value part.
/// Returns null if the format is invalid.
/// </summary>
public static class Parser
{
  // Explicitly document when null can be returned.
  public static string TryGetValue(string line)
  {
    if (line == null) throw new ArgumentNullException("line");
    int idx = line.IndexOf("=");
    if (idx < 0 || idx == line.Length - 1) return null; // documented nullable return
    return line.Substring(idx + 1);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(Parser.TryGetValue("a=1"));
    Console.WriteLine(Parser.TryGetValue("oops")); // prints nothing (null)
  }
}

Lista kontrolna bezpieczeństwa null (C# 6)

Lista kontrolna:

  • Sprawdzaj dane wejściowe za pomocą ArgumentNullException.
  • Domyślnie zwracaj wartości inne niż null, a każde zwracanie null dokumentuj.
  • Używaj niewielkich metod pomocniczych (Require.NotNull), aby zachować przejrzystość kodu.
  • Jeśli ma to sens, preferuj przeciążenia, które nie wymagają null (np. pusty ciąg zamiast null).

Bezpieczeństwo null w C# 6

Szybkie sprawdzenie: W C# 6, które nie obsługuje typów referencyjnych dopuszczających null, jaka praktyka pomaga ograniczyć błędy związane z null w publicznych interfejsach API?

Podsumowanie

Podsumowanie: NRT to nowsza funkcja. W C# 6 zachowuj bezpieczeństwo dzięki kontrolom, jasnej dokumentacji, metodom pomocniczym i przewidywalnym kontraktom zwracania wartości innych niż null.

Bezpłatny start

Ucz się C# dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
93
Lekcje
346

Często zadawane pytania

Czy lekcja „Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6)” jest bezpłatna?

Tak — pełny tekst „Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6)” 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 3 lekcji w sumie.

Co nauczysz się w „Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6)”?

C# 6 nie obsługuje typów referencyjnych dopuszczających null (string?). Proszę nauczyć się bezpiecznej obsługi wartości null: sprawdzania danych wejściowych, przejrzystej dokumentacji, pomocnika Requ… Ć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 3.

Ile czasu zajmuje lekcja „Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6)”?

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. Metody i typy generyczne; ograniczenia
  2. Wariancja (in/out) z interfejsami i delegatami
  3. Typy referencyjne dopuszczające null (świadomość) i adnotacje (wzorce z C# 6)
← Powrót do C# Academy