Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wskazówka
Ten artykuł jest częścią sekcji Podstawy dla deweloperów, którzy znają co najmniej jeden język programowania i uczą się języka C#. Jeśli dopiero zaczynasz programować, najpierw zacznij od samouczków Wprowadzenie . Aby uzyskać więcej informacji, zobacz Typy wartości dopuszczających null w dokumentacji języka.
Typ T? reprezentuje wszystkie wartości swojego bazowego typu Twartości oraz dodatkową null wartość. Zmienna typu int? zawiera dowolną liczbę całkowitą lub null reprezentuje "brak wartości".
Typy wartości, takie jak int, bool i DateTime, nie mogą domyślnie przechowywać null. To zachowanie jest wydajne i zapobiega wielu błędom. Jednak to ograniczenie powoduje problem, gdy wartość może być naprawdę nieobecna. Typowy scenariusz polega na odczytywaniu z bazy danych: kolumna całkowita może zawierać liczbę lub w ogóle nie zawiera wartości (NULL w języku SQL). Zwykły int nie może reprezentować tej nieobecności, ale int? może.
Deklarowanie typu wartości dopuszczającej null
Dołącz ? do dowolnego typu wartości, aby uczynić go dopuszczalnym do wartości null:
int? age = null; // integer with no value yet
double? price = 9.99; // nullable double with a value
bool? isActive = null; // boolean with no value
age = 30; // assign a value later
int?[] scores = [100, null, 85, null, 72]; // array with absent entries
Wartość domyślna typu wartości dopuszczanej do wartości null to null, a nie wartość domyślna bazowego typu.
Sprawdzanie, czy wartość jest obecna
Zalecanym sposobem sprawdzenia typu dopuszczającego wartość null i wyodrębnienia jej wartości jest użycie wzorca typu:
int? temperature = 72;
if (temperature is int degrees)
{
Console.WriteLine($"Temperature is {degrees}°F.");
}
else
{
Console.WriteLine("Temperature is not recorded.");
}
// Output: Temperature is 72°F.
Wzorzec is int degrees jest zgodny tylko wtedy, gdy temperature parametr ma wartość inną niż null i jednocześnie wiąże wartość z wartością degrees. W jednym kroku uzyskasz zarówno sprawdzanie null, jak i wyodrębnianie wartości.
Alternatywnie użyj właściwości HasValue i Value.
int? count = 42;
if (count.HasValue)
{
Console.WriteLine($"Count is {count.Value}.");
}
else
{
Console.WriteLine("Count has no value.");
}
// Output: Count is 42.
Preferuj is T value wzorzec dla nowego kodu. Wprowadza ona nową zmienną niepustą o określonym zakresie dla dopasowanej gałęzi, co sprawia, że intencja jest jaśniejsza i eliminuje wszelkie pokusy przypadkowego użycia Value poza sprawdzaniem wartości null, gdzie zgłosiłaby wartość InvalidOperationException.
Możesz również porównać bezpośrednio z elementem null:
int? quantity = null;
if (quantity != null)
{
Console.WriteLine($"Quantity: {quantity.Value}");
}
else
{
Console.WriteLine("Quantity is not set.");
}
// Output: Quantity is not set.
Pobieranie wartości z rezerwą
Jeśli potrzebujesz wartości innej niż null z typu dopuszczającego wartość null, użyj operatora GetValueOrDefault lub operatora złączającego NULL ??.
int? rating = null;
int result1 = rating.GetValueOrDefault(); // 0 (default for int)
int result2 = rating.GetValueOrDefault(-1); // -1 (specified fallback)
Console.WriteLine(result1); // 0
Console.WriteLine(result2); // -1
rating = 5;
int result3 = rating.GetValueOrDefault(-1); // 5 (actual value)
Console.WriteLine(result3); // 5
Operator ?? jest często czystszy w tekście:
int? priority = null;
int effective = priority ?? 0; // 0 because priority is null
Console.WriteLine(effective); // 0
priority = 3;
effective = priority ?? 0; // 3 because priority has a value
Console.WriteLine(effective); // 3
Obie metody zwracają rzeczywistą wartość, gdy jest obecna, a wartość domyślną, gdy jej nie ma.
Arytmetyka z typami wartości dopuszczanych do wartości null
Operatory arytmetyczne i operatory porównania dla typów wartości dopuszczanych do wartości null są zniesione: jeśli argument operand ma nullwartość , wynikiem jest null zamiast błędu.
int? a = 10;
int? b = 20;
int? c = null;
int? sum = a + b; // both non-null: result is 30
int? product = a * c; // one operand is null: result is null
Console.WriteLine(sum); // 30
Console.WriteLine(product.HasValue); // False — null propagates through arithmetic
Wartość null jest domyślnie propagowana za pomocą arytmetyki. Aby zapobiec propagacji wartości null, wyodrębnij wartość za pomocą ?? lub GetValueOrDefault przed jej użyciem w obliczeniach.