C# null-säkerhet

Tips/Råd

Den här artikeln är en del av avsnittet Grunderna för utvecklare som redan 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.

Kommer du från Java eller C++? C# ger kompileringstid null-säkerhet via null-referenstyper. Målet liknar Java @NonNull anteckningar men framtvingas av kompilatorn. C# har också dedikerade operatorer som ?. och ?? som gör null-säkra uttryck koncisa.

null representerar avsaknaden av ett värde. När du försöker komma åt en medlem på en null referens, genom att anropa en metod eller läsa en egenskap, genererar körningen en NullReferenceException:

// Accessing a member on null throws NullReferenceException at runtime:
// string? name = null;
// int length = name.Length; // throws NullReferenceException

// Check before you dereference:
string? name = null;
if (name is not null)
{
    Console.WriteLine($"Name has {name.Length} characters.");
}
else
{
    Console.WriteLine("Name has no value.");
}
// Output: Name has no value.

C# ger dig tre kompletterande verktyg för att skriva null-säker kod:

  • Typer av null-värden: låt en värdetyp som int eller bool även innehålla null
  • Nullbara referenstyper: låt kompilatorn spåra om en referens kan vara null
  • Null-operatorer: uttrycka null-säker åtkomst och fallback-logik koncist

Typer av null-värden

Värdetyper som int, doubleoch bool kan inte innehålla null som standard. Lägg till ? i typnamnet för att skapa en nullbar värdetyp som innehåller antingen ett värde eller null:

int? score = null;
Console.WriteLine(score.HasValue);               // False

score = 95;
Console.WriteLine(score.HasValue);               // True
Console.WriteLine(score.GetValueOrDefault());    // 95

int? missing = null;
Console.WriteLine(missing.GetValueOrDefault(-1)); // -1

Typer av null-värden är användbara när en underliggande värdetyp behöver representera "inga data". Vanliga scenarier är databaskolumner som kanske saknas, valfria konfigurationsinställningar och sensoravläsningar som inte har avbildats ännu.

Fullständig täckning av deklaration, kontroll och konvertering finns i Nullable value types.

Referenstyper som kan ogiltigförklaras

Referenstyper, till exempel string, matriser och klassinstanser, kan innehålla null vid körning. Nullbara referenstyper är en kompilatorfunktion som gör null-avsikten explicit och fångar upp misstag vid kompileringstillfället.

Genom att använda anteckningen ? deklarerar du din avsikt:

  • string? — Den här referensen kan vara null; kompilatorn varnar om du avreferera den utan att först kontrollera
  • string — Den här referensen bör inte vara null. Kompilatorn varnar om du tilldelar null den
// string?  means this reference might be null
// string   means this reference should not be null
string? nullableName = null;
string  nonNullName  = "Alice";

// ?. safely accesses a member when the reference might be null
string display = nullableName?.ToUpper() ?? "(no name)";
Console.WriteLine(display);         // (no name)

display = nonNullName.ToUpper();    // safe: nonNullName is never null
Console.WriteLine(display);         // ALICE

Alla .NET projekt som moderna SDK-mallar skapar aktiverar nullbara referenstyper som standard. Fullständig vägledning om hur du aktiverar och kommenterar finns i Referenstyper som kan ogiltigförklaras.

Null-operatorer

C# innehåller flera operatorer som gör att du kan skriva null-säker kod utan manuella if-null-skydd överallt:

Operator Name Purpose
?. Null-villkorlig åtkomst av medlem Få endast åtkomst till en medlem när objektet inte är null
?[] Åtkomst till null-villkorsstyrd indexerare Få endast åtkomst till ett element när samlingen inte är null
?? nullsammanslagning Returnera ett återställningsvärde när uttrycket är null
??= Null-sammankopplingstilldelning Tilldela endast när variabeln är null
is null / is not null Null-mönster Föredraget nulltest
string? city = GetCity();

// ?. — access a member only when non-null
int? len = city?.Length;

// ?? — substitute a default when null
string display = city ?? "unknown";

// is null — preferred null test
if (city is null)
{
    Console.WriteLine("No city provided.");
}
else
{
    Console.WriteLine($"{display} ({len} chars)");
}
// Output: No city provided.

Detaljerade exempel på varje operator finns i Null-operatorer.

Nullbara värdetyper och nullbara referenstyper har olika syften

Ogiltiga värdetyper och nullbara referenstyper är inte alternativ. De löser olika problem:

  • Använd T? för en värdetyp som måste representera "inget värde". Du kan till exempel använda int? för en valfri databaskolumn eller DateTime? för en händelse som inte har schemalagts ännu.
  • Använd string? och andra nullbara referensanteckningar för att dokumentera att en referens kan vara null, så att kompilatorn kan varna dig innan en NullReferenceException inträffar under körning.

Tillsammans ger dessa funktioner och null-operatorerna en fullständig uppsättning verktyg för att skriva null-säker C#-kod.