C# null-veiligheid

Tip

Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die al ten minste één programmeertaal kennen en C# leren. Als u nieuw bent met programmeren, begint u eerst met de Aan de slag-tutorials.

Afkomstig van Java of C++? C# biedt compileertijd null-veiligheid door middel van nullable referentietypen. Het doel is vergelijkbaar met Java @NonNull aantekeningen, maar afgedwongen door de compiler. C# heeft ook speciale operators zoals ?. en ?? die null-veilige expressies beknopt maken.

null geeft de afwezigheid van een waarde aan. Wanneer u toegang probeert te krijgen tot een lid op basis van een null verwijzing, door een methode aan te roepen of een eigenschap te lezen, genereert de runtime een 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# biedt u drie aanvullende hulpprogramma's voor het schrijven van null-veilige code:

  • Nullable typen: laat een waardetype zoals int of bool ook null bevatten.
  • <:c0>Nullable referentietypen: de compiler bijhouden of een referentie null kan zijn
  • Null-operators: snelle, veilige toegang en terugvallogica beknopt

Typen null-waarden

Waardetypen zoals int, doubleen bool kunnen niet standaard worden opgeslagen null . Voeg ? toe aan de naam van het type om een nulbare waardetype te maken dat een waarde bevat of 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

Null-waardetypen zijn handig wanneer een onderliggend waardetype 'geen gegevens' moet weergeven. Veelvoorkomende scenario's zijn databasekolommen die mogelijk afwezig zijn, optionele configuratie-instellingen en sensormetingen die nog niet zijn vastgelegd.

Zie Nullable value types voor volledige dekking van declaratie, controle en conversie.

Nullable referentietypen

Referentietypen, zoals string-arrays en klasse-exemplaren, kunnen null bevatten tijdens runtime. Nullable-referentietypen is een compilerfunctie die null-intentie expliciet maakt en fouten onderschept tijdens compilatietijd.

Met behulp van de ? aantekening declareert u uw intentie:

  • string? — deze verwijzing kan zijn null; de compiler waarschuwt als u deze deducteert zonder eerst te controleren
  • string— deze verwijzing mag niet zijnnull; de compiler waarschuwt als u eraan toewijst null
// 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

Alle .NET projecten die moderne SDK-sjablonen maken, maken standaard null-referentietypen mogelijk. Zie Nullable-referentietypen voor volledige richtlijnen voor het inschakelen en toevoegen van aantekeningen.

Nulloperators

C# bevat verschillende operators waarmee u overal null-veilige code kunt schrijven zonder handmatige if-null-beveiligingen:

Operator Name Purpose
?. Null-voorwaardelijke leden toegang Alleen toegang krijgen tot een lid als het object niet null is
?[] Toegang tot null-voorwaardelijke indexeerfunctie Alleen toegang krijgen tot een element wanneer de verzameling niet null is
?? null-samenvoeging Een terugvalwaarde retourneren wanneer de expressie is null
??= Null-samenvoegende toewijzing Alleen toewijzen wanneer de variabele is null
is null / is not null Null-patroon Voorkeurs-null-test
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.

Zie Null-operators voor gedetailleerde voorbeelden van elke operator.

Nullable waardetypes en nullable referentietypes dienen verschillende doelen.

Nullable value types en nullable reference types zijn geen alternatieven. Ze lossen verschillende problemen op:

  • Gebruiken T? voor een waardetype dat 'geen waarde' moet vertegenwoordigen. Gebruik bijvoorbeeld int? voor een optionele databasekolom of DateTime? voor een gebeurtenis die nog niet is gepland.
  • Gebruik string? en andere nullable referentieannotaties om te documenteren dat een referentie mogelijk null is, zodat de compiler u kan waarschuwen voordat er een NullReferenceException-fout optreedt tijdens runtime.

Samen bieden deze functies en de null-operators u een volledige set hulpprogramma's voor het schrijven van null-veilige C#-code.