Nullbara värdetyper: Grunderna i C#

Tips/Råd

Den här artikeln är en del av avsnittet Grunderna för utvecklare som känner till minst ett programmeringsspråk och lär sig C#. Om du inte har använt programmering tidigare börjar du med självstudierna Komma igång först. Mer information finns under Nullable value types i språkreferensen.

En nullbar värdetypT? representerar alla värden av dess underliggande värdetyp Tplus ytterligare ett null värde. En variabel av typen int? innehåller ett heltal eller null för att representera "inget värde".

Värdetyper som int, booloch DateTime kan inte innehålla null som standard. Det här beteendet är effektivt och förhindrar många fel. Den här begränsningen skapar dock ett problem när ett värde verkligen saknas. Ett vanligt scenario är att läsa från en databas: en heltalskolumn kan innehålla ett tal, eller så kanske den inte innehåller något värde alls (NULL i SQL). En vanlig int kan inte representera den frånvaron, men int? kan.

Deklarera en värdetyp som kan ogiltigförklaras

? Lägg till i valfri värdetyp för att göra den nullbar:

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

Standardvärdet för en nullbar värdetyp är null, inte den underliggande typens standardvärde.

Kontrollera om ett värde finns

Det rekommenderade sättet att kontrollera en nullbar värdetyp och extrahera dess värde är med ett typmönster:

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.

Mönstret is int degrees matchar endast när temperature är icke-null och binder samtidigt värdet till degrees. Du får både null-kontrollen och värdeextraheringen i ett steg.

Du kan också använda HasValue egenskaperna och Value :

int? count = 42;

if (count.HasValue)
{
    Console.WriteLine($"Count is {count.Value}.");
}
else
{
    Console.WriteLine("Count has no value.");
}
// Output: Count is 42.

Föredra detta is T value-mönster för ny kod. Den introducerar en ny icke-nullbar variabel som är begränsad till den matchade grenen, vilket gör avsikten tydligare och eliminerar frestelsen att oavsiktligt använda Value utanför en null-kontroll, där det skulle resultera i en InvalidOperationException.

Du kan också jämföra direkt med null:

int? quantity = null;

if (quantity != null)
{
    Console.WriteLine($"Quantity: {quantity.Value}");
}
else
{
    Console.WriteLine("Quantity is not set.");
}
// Output: Quantity is not set.

Hämta ett värde med en reservlösning

När du behöver ett icke-nullbart värde från en nullbar, använd GetValueOrDefault eller null-coalescing-operatorn ?? :

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

Operatorn ?? är ofta renare när den används inline.

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

Båda metoderna returnerar det faktiska värdet när ett finns, och reservvärdet som du anger när det inte finns.

Aritmetik med nullbara värdetyper

Aritmetiska och jämförelseoperatorer på nullbara värdetyper är lyfta. När någon av operanderna är null, resulterar det i null istället för ett fel.

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

Null fortplantar sig som standard genom aritmetik. Om du vill förhindra att ett null-resultat fortsätter extraherar du värdet med ?? eller GetValueOrDefault innan du använder det i en beräkning.

Se även