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