Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Tip
Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die ten minste één programmeertaal kennen en C# leren. Als u nieuw bent met programmeren, begint u eerst met de Aan de slag-tutorials. Voor de volledige verwijzing naar operatoren, zie ledentoegangsoperatoren en null-samenvoegingsoperatoren in de taalverwijzing.
C# biedt verschillende operators die null-safe code beknopt maken. In plaats van if (x != null) guard-statements in uw code te nesten, kunt u met deze operators null-veilig toegang, terugvalwaarden en null-tests in één uitdrukking uitdrukken.
In dit artikel wordt ?. en ?[] voor voorwaardelijke toegang, ?? voor null-coalescing, ??= voor null-coalescing-toewijzing, en is null/is not null voor patroonvergelijking besproken.
Voorwaardelijke null-lidtoegang ?.
De ?. operator heeft alleen toegang tot een lid wanneer het object niet null is. Wanneer het object null is, wordt de hele expressie geëvalueerd als null in plaats van het werpen van een NullReferenceException.
string? name = null;
// Without ?., accessing a member on null throws NullReferenceException:
// int len = name.Length; // throws if name is null
// ?. returns null instead of throwing:
int? len = name?.Length;
Console.WriteLine(len.HasValue); // False
name = "C#";
Console.WriteLine(name?.Length); // 2
De ?.-operator kortsluit: wanneer de linkerzijde null is, wordt alles aan de rechterkant overgeslagen. Er worden geen methodeaanroepen uitgevoerd en er treden geen bijwerkingen op.
U kunt meerdere ?. operators in één expressie koppelen. De ketting stopt bij de eerste null die het tegenkomt:
string? input = null;
// Chain ?. across multiple method calls — short-circuits at the first null:
string? upper = input?.Trim()?.ToUpperInvariant();
Console.WriteLine(upper ?? "(none)"); // (none)
input = " hello ";
Console.WriteLine(input?.Trim()?.ToUpperInvariant()); // HELLO
Toegang tot null-voorwaardelijke indexeerfunctie ?[]
De ?[] operator past hetzelfde kortsluitingsgedrag toe op indexeerfunctie en matrixtoegang. Gebruik deze functie wanneer de verzameling zelf kan zijn null:
string[]? tags = null;
// ?[] accesses an element only when the collection is non-null
string? first = tags?[0];
Console.WriteLine(first ?? "(none)"); // (none)
tags = ["csharp", "dotnet", "nullable"];
Console.WriteLine(tags?[0]); // csharp
Null-voorwaardelijke operatoren koppelen
Koppel meerdere ?. operators om een pad met mogelijk null-referenties te doorlopen. De kring kortsluit bij de eerste null:
var order = new Order("ORD-001", null);
// Each ?. short-circuits when null: Customer is null, so Address and City are never accessed
string? city = order.Customer?.Address?.City;
Console.WriteLine(city ?? "(no city)"); // (no city)
var fullOrder = new Order("ORD-002",
new Customer("Alice", new Address("123 Main St", "Springfield", "IL")));
Console.WriteLine(fullOrder.Customer?.Address?.City); // Springfield
Wanneer Customernull is, wordt noch Address noch City geëvalueerd. De hele uitdrukking retourneert null.
Thread-veilige aanroep van gedelegeerde
?. biedt een schone, thread-veilige manier om een delegate aan te roepen of een gebeurtenis op te wekken. De gedelegeerde-expressie wordt slechts één keer geëvalueerd, dus er is geen venster voor een andere thread om u af te melden tussen de null-controle en de aanroep:
EventHandler? clicked = null;
// No subscribers — ?.Invoke does nothing instead of throwing NullReferenceException
clicked?.Invoke(null, EventArgs.Empty);
clicked += (_, _) => Console.WriteLine("Button clicked!");
// With a subscriber — ?.Invoke calls the handler
clicked?.Invoke(null, EventArgs.Empty);
// Output: Button clicked!
Dit patroon vervangt de oudere if (clicked != null) clicked(...) idioom.
Null-coalescing ??
De ?? operator retourneert de linkeroperand wanneer deze niet null is en de rechteroperand wanneer de linkeroperand is null. Gebruik deze om een standaardwaarde op te geven:
string? username = null;
// ?? returns the right-hand value when the left-hand is null
string display = username ?? "Guest";
Console.WriteLine(display); // Guest
username = "alice";
display = username ?? "Guest";
Console.WriteLine(display); // alice
?? is juist associatief, dus a ?? b ?? c evalueert als a ?? (b ?? c). De eerste niet-null-waarde wint. Een veelvoorkomend patroon is om ?. te ketenen met ??: gebruik ?. om veilig een keten met mogelijke null-waarde te doorlopen, en vervolgens ?? om een standaardwaarde te gebruiken als de keten null retourneert. Zie Null-operators combineren voor een volledig voorbeeld.
Toewijzing null-coalescing ??=
De ??= operator wijst de rechterwaarde alleen toe aan een variabele wanneer de variabele is null. Gebruik deze voor luie initialisatie:
List<string>? cache = null;
// ??= assigns only when the variable is null
cache ??= LoadData();
Console.WriteLine(cache.Count); // 3
// cache is already non-null, so LoadData() isn't called again
cache ??= LoadData();
Console.WriteLine(cache.Count); // 3
static List<string> LoadData() => ["alpha", "beta", "gamma"];
De rechterexpressie wordt alleen geëvalueerd wanneer de variabele is null. Wanneer de variabele al een waarde heeft, wordt de rechterkant helemaal niet geëvalueerd.
Null-voorwaardelijke toewijzing (C# 14)
Vanaf C# 14 kunt u ?. en ?[] als toewijzingsdoelen gebruiken. De toewijzing wordt alleen uitgevoerd wanneer het linkerobject niet null is:
AppConfig? config = new AppConfig();
// Assigns only when config is non-null (C# 14)
config?.Theme = "dark";
Console.WriteLine(config?.Theme); // dark
AppConfig? missing = null;
missing?.Theme = "light"; // no-op: missing is null
Console.WriteLine(missing?.Theme ?? "(no config)"); // (no config)
De rechterkant wordt alleen geëvalueerd wanneer bekend is dat de linkerkant niet null is.
Null-patroonovereenkomst: is null en is not null
De patronen is null en is not null testen of een expressie null:
string? input = null;
// is null is the preferred test — unaffected by operator overloading
if (input is null)
{
Console.WriteLine("No input provided.");
}
// == null also works, but a custom == operator can change its behavior
if (input == null)
{
Console.WriteLine("Still no input.");
}
Geef de voorkeur aan is null boven == null voor nulcontroles. De == operator kan overladen zijn, wat betekent dat x == nulltrue kan retourneren, zelfs als x niet null is, als het type een aangepaste gelijkheidsoperator definieert. Het is null-patroon test altijd op de echte null-referentie, ongeacht operatoroverlading.
string? value = "hello";
if (value is not null)
{
Console.WriteLine(value.ToUpper()); // HELLO
}
Null-operators combineren
In de praktijk combineert u vaak verschillende van deze operators. Een enkele uitdrukking kan veilig door een diepe objectgrafiek navigeren, een fallback gebruiken en vervolgens het resultaat controleren.
Order? order = GetPendingOrder();
// Chain ?. for safe traversal, ?? for a fallback, is null for a clear guard
string city = order?.Customer?.Address?.City ?? "unknown";
if (order is null)
{
Console.WriteLine("No pending order.");
}
else
{
Console.WriteLine($"Shipping to: {city}");
}
// Output: No pending order.
Null-forgiving-operator !
De ! achtervoegseloperator onderdrukt nullable-waarschuwingen. Voeg toe ! om de compiler te laten weten dat deze expressie zeker niet null is. De operator heeft geen effect tijdens runtime. Dit is alleen van invloed op de null-statusanalyse van de compiler.
string? name = FindUser("alice");
// Use ! only when you have information the compiler doesn't.
// FindUser guarantees a non-null result for known usernames.
int length = name!.Length;
Console.WriteLine(length); // 5
Gebruik ! spaarzaam en alleen als u informatie hebt die de compiler niet heeft. Voorbeelden hiervan zijn tests die opzettelijk null doorgeven om de argumentcontrolelogica te valideren, of het aanroepen van een methode waarvan het contract een niet-nulretour voor een bekende invoer garandeert. Overmatig gebruik van ! doet afbreuk aan het doel van nullable referentietypen. Zie Nullable-referentietypen voor een volledige uitleg.