Odpowiedzi:
Oznacza to, że typ wartości, o którym mowa, jest rodzajem zerowalnym
Typy zerowalne są instancjami struktury System.Nullable. Typ dopuszczający wartości zerowe może reprezentować prawidłowy zakres wartości dla swojego podstawowego typu wartości, a także dodatkową wartość zerową. Na przykład,
Nullable<Int32>
wymawianemu „Nullable Int32” można przypisać dowolną wartość od -2147483648 do 2147483647 lub można mu przypisać wartość null.Nullable<bool>
Można przypisać wartości true, false lub null. Możliwość przypisania wartości null do typów numerycznych i boolowskich jest szczególnie przydatna, gdy mamy do czynienia z bazami danych i innymi typami danych, które zawierają elementy, którym nie można przypisać wartości. Na przykład pole boolowskie w bazie danych może przechowywać wartości true lub false lub może być niezdefiniowane.class NullableExample { static void Main() { int? num = null; // Is the HasValue property true? if (num.HasValue) { System.Console.WriteLine("num = " + num.Value); } else { System.Console.WriteLine("num = Null"); } // y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (System.InvalidOperationException e) { System.Console.WriteLine(e.Message); } } }
int
typie i odpowiedniej Integer
klasie.
To jest skrót od Nullable<int>
. Nullable<T>
służy do ustawienia typu wartości na null
. Typy wartości zwykle nie mogą mieć wartości NULL .
value types
nie może być pusty. Jeśli zadeklarujesz int lub bool (które są typami wartości) bez specjalnego przypisania wartości, nadal będą miały wartości (odpowiednio 0 i fałsz), tj. nie byłyby zerowe. Nieprzypisane reference types
, takie jak object lub MyClass, z drugiej strony będą zerowe. Możesz przeczytać o różnicy między typami wartości a typami referencyjnymi.
W
x ? "yes" : "no"
? deklaruje zdanie if . Tutaj: x oznacza warunek logiczny; Część przed : to wtedy zdanie, a część po to inny wyrok.
Na przykład
int?
? deklaruje typ zerowalny i oznacza, że typ przed nim może mieć wartość zerową.
return value ? value : "isNull";
mówi mi, że string value
nie można zamienić na bool.
Typy zerowalne są instancjami struktury System.Nullable. Typ dopuszczający wartości zerowe może reprezentować normalny zakres wartości dla jego podstawowego typu wartości, a także dodatkową wartość zerową . Na przykład [
Nullable<Int32>
], wymawiane jako „Nullable Int32”, można przypisać dowolną wartość od -2147483648 do 2147483647 lub można mu przypisać wartość zerową. Do [Nullable<bool>
] można przypisać wartości true lub false lub null. Możliwość przypisania wartości null do typów numerycznych i boolowskich jest szczególnie przydatna w przypadku baz danych i innych typów danych zawierających elementy, którym nie można przypisać wartości. Na przykład pole boolowskie w bazie danych może przechowywać wartości true lub false lub może być niezdefiniowane.
deklaruje, że typ jest zerowalny.
praktyczne zastosowanie:
public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
if (value == null)
{
return "bad value";
}
return someFunctionThatHandlesIntAndReturnsString(value);
}
Aby dodać do powyższych odpowiedzi, oto przykładowy kod
struct Test
{
int something;
}
struct NullableTest
{
int something;
}
class Example
{
public void Demo()
{
Test t = new Test();
t = null;
NullableTest? t2 = new NullableTest();
t2 = null;
}
}
Dałoby to błąd kompilacji:
Błąd 12 Nie można przekonwertować wartości null na „Test”, ponieważ jest to typ wartości, który nie ma wartości zerowej
Zauważ, że nie ma błędu kompilacji dla NullableTest. (zwróć uwagę na? w deklaracji t2)
int?
jest skrótem od Nullable<int>
. Te dwie formy są wymienne.
Nullable<T>
to operator, którego można użyć z typem wartości, T
aby go zaakceptować null
.
W przypadku, gdy nie wiem: wartości typy są typami, który przyjmuje wartości jak int
, bool
, char
itp ...
Nie mogą akceptować odwołań do wartości: wygenerowaliby błąd czasu kompilacji, jeśli przypiszesz im a null
, w przeciwieństwie do typów referencji , które oczywiście mogą to zaakceptować.
Dlaczego miałbyś tego potrzebować? Ponieważ czasami zmienne typu wartości mogą otrzymywać referencje zerowe zwracane przez coś, co nie działało zbyt dobrze, na przykład brakującą lub niezdefiniowaną zmienną zwróconą z bazy danych.
Sugeruję przeczytanie Dokumentacji Microsoft, ponieważ dość dobrze obejmuje ona ten temat.