Typy hodnot s možnou hodnotou null (referenční dokumentace jazyka C#)
Typ T?
hodnoty s možnou hodnotou null představuje všechny hodnoty jeho základního typu T
hodnoty a další hodnotu null. Můžete například přiřadit k proměnné některou bool?
z následujících tří hodnot: true
, false
nebo null
. Základní typ T
hodnoty nemůže být samotný typ hodnoty null.
Libovolný typ hodnoty null je instance obecné System.Nullable<T> struktury. Můžete odkazovat na typ hodnoty null s podkladovým typem T
v některé z následujících zaměnitelných formulářů: Nullable<T>
nebo T?
.
Typ hodnoty null obvykle používáte v případě, že potřebujete reprezentovat nedefinovanou hodnotu základního typu hodnoty. Například logická hodnota nebo bool
proměnná může být true
pouze nebo false
. V některýchaplikacích Například pole databáze může obsahovat nebo false
, nebo může obsahovat true
žádnou hodnotu vůbec, to znamená NULL
. Typ můžete použít bool?
v tomto scénáři.
Deklarace a přiřazení
Vzhledem k tomu, že typ hodnoty je implicitně konvertibilní na odpovídající typ hodnoty null, můžete přiřadit hodnotu proměnné typu hodnoty s možnou hodnotou null, jak byste to udělali pro jeho základní typ hodnoty. Můžete také přiřadit null
hodnotu. Příklad:
double? pi = 3.14;
char? letter = 'a';
int m2 = 10;
int? m = m2;
bool? flag = null;
// An array of a nullable value type:
int?[] arr = new int?[10];
Výchozí hodnota typu hodnoty null představuje null
, to znamená instance, jejíž Nullable<T>.HasValue vlastnost vrací false
.
Kontrola instance typu hodnoty s možnou hodnotou null
Operátor se vzorem typu můžete použít is
k prozkoumání instance typu null
hodnoty s možnou hodnotou null a načtení hodnoty základního typu:
int? a = 42;
if (a is int valueOfA)
{
Console.WriteLine($"a is {valueOfA}");
}
else
{
Console.WriteLine("a does not have a value");
}
// Output:
// a is 42
K prozkoumání a získání hodnoty proměnné typu hodnoty s možnou hodnotou null můžete vždy použít následující vlastnosti jen pro čtení:
Nullable<T>.HasValue určuje, zda má instance typu hodnoty nullable hodnotu hodnotu jeho základního typu.
Nullable<T>.Value získá hodnotu základního typu, pokud HasValue je
true
. Pokud HasValue jefalse
, Value vlastnost vyvolá .InvalidOperationException
Následující příklad používá HasValue
vlastnost k otestování, zda proměnná obsahuje hodnotu před zobrazením:
int? b = 10;
if (b.HasValue)
{
Console.WriteLine($"b is {b.Value}");
}
else
{
Console.WriteLine("b does not have a value");
}
// Output:
// b is 10
Můžete také porovnat proměnnou typu hodnoty s možnou hodnotou null namísto null
použití HasValue
vlastnosti, jak ukazuje následující příklad:
int? c = 7;
if (c != null)
{
Console.WriteLine($"c is {c.Value}");
}
else
{
Console.WriteLine("c does not have a value");
}
// Output:
// c is 7
Převod typu hodnoty s možnou hodnotou null na podkladový typ
Pokud chcete přiřadit hodnotu typu hodnoty null s možnou hodnotou proměnné typu nenulable, bude pravděpodobně nutné zadat hodnotu, která má být přiřazena místo null
. K tomu použijte operátor ??
null-coalescing (můžete také použít metodu Nullable<T>.GetValueOrDefault(T) pro stejný účel):
int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}"); // output: b is 28
int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}"); // output: d is -1
Pokud chcete použít výchozí hodnotu základního typu hodnoty místo null
, použijte metodu Nullable<T>.GetValueOrDefault() .
Můžete také explicitně přetypovat typ hodnoty null na nenulový typ, jak ukazuje následující příklad:
int? n = null;
//int m1 = n; // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null
Pokud je null
hodnota typu hodnoty null za běhu, vyvolá explicitní přetypování hodnotu InvalidOperationException.
Typ T
hodnoty, který není nullable, je implicitně konvertibilní na odpovídající typ T?
hodnoty nullable .
Operátory se zvednutím
Předdefinované unární a binární operátory nebo všechny přetížené operátory podporované typem T
hodnoty jsou podporovány také odpovídajícím typem T?
hodnoty nullable . Tyto operátory, označované také jako lifted operátory, vytvářejí null
, pokud jsou null
jeden nebo oba operandy ; jinak operátor používá k výpočtu výsledku obsažené hodnoty svých operandů. Příklad:
int? a = 10;
int? b = null;
int? c = 10;
a++; // a is 11
a = a * c; // a is 110
a = a + b; // a is null
Poznámka:
bool?
U typu předdefinované &
operátory a |
operátory neodpovídají pravidlům popsaným v této části: výsledek vyhodnocení operátoru může být nenulový, i když je null
některý z operandů . Další informace naleznete v části logické operátory logické operátory s možnou hodnotou Null v článku logické operátory logických operátorů s možnou hodnotou Null.
Pro relační operátory <
, , <=
>
a >=
, pokud jeden nebo oba operandy jsou null
, výsledek je false
; v opačném případě jsou porovnány obsažené hodnoty operandů. Nepředpokládáme, že vzhledem k tomu, že konkrétní porovnání (například <=
) vrátí false
, opačné porovnání (>
) vrátí true
. Následující příklad ukazuje, že 10 je
- ani větší než nebo rovno
null
- ani menší než
null
int? a = 10;
Console.WriteLine($"{a} >= null is {a >= null}");
Console.WriteLine($"{a} < null is {a < null}");
Console.WriteLine($"{a} == null is {a == null}");
// Output:
// 10 >= null is False
// 10 < null is False
// 10 == null is False
int? b = null;
int? c = null;
Console.WriteLine($"null >= null is {b >= c}");
Console.WriteLine($"null == null is {b == c}");
// Output:
// null >= null is False
// null == null is True
Pro operátor ==
rovnosti , pokud jsou oba operandy null
, výsledek je true
, pokud je pouze jeden z operandů , výsledek je null
false
; v opačném případě jsou hodnoty obsažené operandy porovnány.
Pro operátor !=
nerovnosti , pokud jsou oba operandy null
, výsledek je false
, pokud je pouze jeden z operandů , výsledek je null
true
; v opačném případě jsou hodnoty obsažené operandy porovnány.
Pokud existuje uživatelsky definovaný převod mezi dvěma typy hodnot, lze stejný převod použít také mezi odpovídajícími typy hodnot s možnou hodnotou null.
Boxing and unboxing
Instance typu T?
hodnoty s možnou hodnotou null je zadána takto:
- Pokud HasValue se vrátí
false
, vytvoří se nulový odkaz. - Pokud HasValue se vrátí
true
, odpovídající hodnota základního typuT
hodnoty je boxována, nikoli instance Nullable<T>.
Pole s hodnotou typu T
hodnoty můžete rozbalit na odpovídající typ T?
hodnoty null, jak ukazuje následující příklad:
int a = 41;
object aBoxed = a;
int? aNullable = (int?)aBoxed;
Console.WriteLine($"Value of aNullable: {aNullable}");
object aNullableBoxed = aNullable;
if (aNullableBoxed is int valueOfA)
{
Console.WriteLine($"aNullableBoxed is boxed int: {valueOfA}");
}
// Output:
// Value of aNullable: 41
// aNullableBoxed is boxed int: 41
Identifikace typu hodnoty s možnou hodnotou null
Následující příklad ukazuje, jak určit, zda System.Type instance představuje vytvořený typ hodnoty null, to znamená System.Nullable<T> typ se zadaným parametrem T
typu:
Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} value type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non-nullable")} value type");
bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;
// Output:
// int? is nullable value type
// int is non-nullable value type
Jak ukazuje příklad, použijete k vytvoření System.Type instance operátor typeof.
Pokud chcete zjistit, jestli je instance typu hodnoty null, nepoužívejte metodu Object.GetType Type k získání instance, která se má testovat s předchozím kódem. Při volání Object.GetType metody u instance typu hodnoty nullable je instance boxed na Object. Při boxování instance typu hodnoty s možnou hodnotou null je ekvivalentní boxování hodnoty základního typu, vrátí Type instanci, GetType která představuje základní typ hodnoty s možnou hodnotou null:
int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32
Nepoužívejte také operátor is k určení, zda instance je typu hodnoty null. Jak ukazuje následující příklad, nemůžete rozlišovat typy typu hodnoty null a jeho základní typ instance s operátorem is
:
int? a = 14;
if (a is int)
{
Console.WriteLine("int? instance is compatible with int");
}
int b = 17;
if (b is int?)
{
Console.WriteLine("int instance is compatible with int?");
}
// Output:
// int? instance is compatible with int
// int instance is compatible with int?
Místo toho použijte z prvního příkladu Nullable.GetUnderlyingType a operátor typeof ke kontrole, zda je instance typu hodnoty null.
Poznámka:
Metody popsané v této části nelze použít v případě typů odkazů s možnou hodnotou null.
specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#:
- Typy s možnou hodnotou null
- Operátory se zvednutím
- Implicitní převody s možnou hodnotou null
- Explicitní převody s možnou hodnotou null
- Operátory zdviženého převodu