Używanie typów dopuszczających wartości zerowe (Przewodnik programowania w języku C#)
Typy Nullable może reprezentować wszystkich wartości typu podstawowych i dodatkowych null wartości.Typy Nullable są uznane za jeden z dwóch sposobów:
System.Nullable<T> variable
- lub -
T? variable
Tjest typem podstawowym typem niewymaganym.Tmoże być dowolny typ wartości łącznie z struct; nie może być typem odwołania.
Przykładem, kiedy można użyć typu NULL, należy rozważyć, jak zwykłe zmienna logiczna może mieć dwie wartości: PRAWDA i FAŁSZ.Nie ma żadnej wartości, który oznacza "undefined".W wielu aplikacjach programowania przede wszystkim database interakcje, zmiennych mogą występować w stanie niezdefiniowany.Na przykład pola w bazie danych może zawierać wartości PRAWDA lub FAŁSZ, ale może również zawierać żadnej wartości w ogóle.Podobnie, można ustawić typy odwołań null , aby wskazać, że nie jest inicjowany.
Ta rozbieżność, można utworzyć dodatkowe programowania pracy z dodatkowe zmienne używane do przechowywania informacji o stanie, stosowanie specjalnych wartości i tak dalej.Modyfikator typem niewymaganym umożliwia C# utworzyć typ wartości zmiennych, które wskazują niezdefiniowana wartość.
Przykłady typów Nullable
Dowolny typ wartości mogą służyć jako podstawa dla typu null.Na przykład:
int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];
Członkowie Nullable typów
Każde wystąpienie typu null ma dwie publiczne właściwości tylko do odczytu:
HasValue
HasValueTyp jest bool.Jest równa true kiedy zmienna zawiera wartość niezerową.
Value
Valuejest tego samego typu, jak typ podstawowy.Jeśli HasValue jest true, Value zawiera odpowiednią wartość.If HasValue is false, accessing Value will throw a InvalidOperationException.
W tym przykładzie HasValue element jest używany do testowania, czy zmienna zawiera wartość, zanim spróbuje go wyświetlić.
int? x = 10;
if (x.HasValue)
{
System.Console.WriteLine(x.Value);
}
else
{
System.Console.WriteLine("Undefined");
}
Badania na wartość może być wykonane jak w poniższym przykładzie:
int? y = 10;
if (y != null)
{
System.Console.WriteLine(y.Value);
}
else
{
System.Console.WriteLine("Undefined");
}
Konwersje jawne
Typem niewymaganym można rzutować typu regularnych, wyraźnie z wytopu lub za pomocą Value właściwości.Na przykład:
int? n = null;
//int m1 = n; // Will not compile.
int m2 = (int)n; // Compiles, but will create an exception if n is null.
int m3 = n.Value; // Compiles, but will create an exception if n is null.
Jeśli zdefiniowano zdefiniowana przez użytkownika konwersja między typami danych dwóch samego konwersji można również z nullable wersje tych typów danych.
Konwersje niejawne
Zmienna typu NULL można ustawić na wartość zerową, z null słowa kluczowego, jak pokazano w następującym przykładzie:
int? n1 = null;
Konwersja z typu zwykłych do typu null jest niejawne.
int? n2;
n2 = 10; // Implicit conversion.
Podmioty gospodarcze
Jednoargumentowy wstępnie zdefiniowanych i operatory dwuargumentowe i zdefiniowane przez użytkownika operatorów, które istnieją dla typów wartości może również używane przez typu null.Tych operatorów daje wartość null, jeśli operandy są równe null; w przeciwnym razie operator używa zamkniętego wartości do obliczenia wyniku.Na przykład:
int? a = 10;
int? b = null;
a++; // Increment by 1, now a is 11.
a = a * 10; // Multiply by 10, now a is 110.
a = a + b; // Add b, now a is null.
Po wykonaniu porównania z typami NULL, jeśli wartość typu null jest null, a drugiej nie jest wszystkie porównania oceniają false z wyjątkiem != (nie równych).Ważne, aby nie zakładać, że ponieważ zwraca szczególną porównanie jest false, w przeciwnym wypadku zwraca true.W poniższym przykładzie 10 nie jest większa, mniejsza niż ani równa null.Tylko num1 != num2 wynikiem true.
int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
Console.WriteLine("num1 is greater than or equal to num2");
}
else
{
// This clause is selected, but num1 is not less than num2.
Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)");
}
if (num1 < num2)
{
Console.WriteLine("num1 is less than num2");
}
else
{
// The else clause is selected again, but num1 is not greater than
// or equal to num2.
Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)");
}
if (num1 != num2)
{
// This comparison is true, num1 and num2 are not equal.
Console.WriteLine("Finally, num1 != num2 returns true!");
}
// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
// The equality comparison returns true when both operands are null.
Console.WriteLine("num1 == num2 returns true when the value of each is null");
}
/* Output:
* num1 >= num2 returned false (but num1 < num2 also is false)
* num1 < num2 returned false (but num1 >= num2 also is false)
* Finally, num1 != num2 returns true!
* num1 == num2 returns true when the value of each is null
*/
Wynikiem porównania równości z dwóch typów nullable, które są zarówno null true.
??Operator
?? Operator określa wartość domyślną, która jest zwracana, gdy typem niewymaganym jest przypisany do typu null.
int? c = null;
// d = c, unless c is null, in which case d = -1.
int d = c ?? -1;
Ten operator można również z wielu typów nullable.Na przykład:
int? e = null;
int? f = null;
// g = e or f, unless e and f are both null, in which case g = -1.
int g = e ?? f ?? -1;
Bool?Typ
bool? Typem niewymaganym może zawierać trzy różne wartości: true, false i null.Aby uzyskać informacje na temat rzutować z bool?Aby bool, zobacz Porady: bezpieczne rzutowanie bool? na bool (Przewodnik programowania w języku C#).
Wartości NULL logiczne są podobne Boolean typu zmiennej, która jest używana w języku SQL.Aby zapewnić, że wyniki uzyskane przez & i| podmioty gospodarcze są zgodne z trzech wyceniana typu Boolean w języku SQL, są dostarczane następujące operatory wstępnie zdefiniowane:
bool? operator &(bool? x, bool? y)
bool? operator |(bool? x, bool? y)
Wyniki te podmioty gospodarcze są wymienione w poniższej tabeli:
X |
y |
x i y |
x|y |
---|---|---|---|
PRAWDA |
PRAWDA |
PRAWDA |
PRAWDA |
PRAWDA |
FAŁSZ |
FAŁSZ |
PRAWDA |
PRAWDA |
NULL |
NULL |
PRAWDA |
FAŁSZ |
PRAWDA |
FAŁSZ |
PRAWDA |
FAŁSZ |
FAŁSZ |
FAŁSZ |
FAŁSZ |
FAŁSZ |
NULL |
FAŁSZ |
NULL |
NULL |
PRAWDA |
NULL |
PRAWDA |
NULL |
FAŁSZ |
FAŁSZ |
NULL |
NULL |
NULL |
NULL |
NULL |
Zobacz też
Informacje
Typy dopuszczające wartości zerowe (Przewodnik programowania w języku C#)
Konwersja boxing typów dopuszczających wartości zerowe (Przewodnik programowania w języku C#)