Nullable typer
I C# skiljer man på typer som kan vara null och typer som aldrig ska vara det. Sedan C# 8 kan du aktivera nullable reference types — kompilatorn hjälper dig fånga null-fel innan de kraschar programmet.
När du läst detta ska du kunna
- Använda
int?och andra nullable value types - Förstå vad nullable reference types (C# 8) innebär
- Använda null-operatorerna
?.,??,??=,! - Läsa och skriva kod som hanterar null säkert
Nullable value types — int?
Vanliga värdetyper (int, bool, DateTime) kan aldrig vara null. Lägger du till ? blir de nullable:
int a = null; // Kompileringsfel!int? b = null; // OK
int? age = null;
if (age.HasValue) Console.WriteLine($"Ålder: {age.Value}");else Console.WriteLine("Ålder okänd");Output
Age unknownNullable reference types — C# 8 ✨
Sedan C# 8 kan du säga att en referenstyp (t.ex. string) inte får vara null — kompilatorn varnar om du riskerar en NullReferenceException.
Aktiveras med <Nullable>enable</Nullable> i .csproj (standardvärde i nya .NET 6+-projekt).
string a = null; // ⚠️ Varning — string ska inte vara nullstring? b = null; // OK — explicit nullable
void Greet(string name) // name får inte vara null{ Console.WriteLine($"Hej {name}!");}
void GreetMaybe(string? name) // name kan vara null{ Console.WriteLine($"Hej {name ?? "unknown"}!");}Null-operatorer
?. — null-conditional
Anropar bara om objektet inte är null. Returnerar null annars.
string? text = null;
int? length = text?.Length; // null — inget NullReferenceExceptionConsole.WriteLine(length); // (tomt)
text = "Hej";Console.WriteLine(text?.Length); // 3?? — null-coalescing
Returnerar höger sida om vänster är null.
string? name = null;string displayName = name ?? "Gäst";
Console.WriteLine(displayName); // Gäst??= — null-coalescing assignment (C# 8)
Tilldelar bara om variabeln är null.
string? cache = null;cache ??= "standardvärde";
Console.WriteLine(cache); // standardvärde! — null-forgiving operator
Säger till kompilatorn “jag vet att detta inte är null”. Använd sparsamt.
string? text = GetText();int length = text!.Length; // Du garanterar att text inte är nullKedja null-operatorer
var city = person?.Address?.City ?? "Okänd stad";Läser: hämta person.Address.City — om något längs vägen är null, använd "Okänd stad".
TL;DR
| Syntax | Vad det gör |
|---|---|
int? | Värdetyp som kan vara null |
string? | Referenstyp som explicit tillåts vara null (C# 8) |
?. | Anropa bara om inte null |
?? | Defaultvärde om null |
??= | Tilldela bara om null (C# 8) |
! | “Jag lovar att det inte är null” |