Delen via


Typen null-waarden (C#-verwijzing)

Een dat null kan worden gebruikt, vertegenwoordigt alle waarden van het onderliggende T? en een extra null-waardeT. U kunt bijvoorbeeld een van de volgende drie waarden toewijzen aan een bool? variabele: true, falseof null. Een onderliggend waardetype T kan geen type null-waarde zelf zijn.

De C#-taalreferentiedocumenten de laatst uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

Een null-waardetype is een exemplaar van de algemene System.Nullable<T> structuur. U kunt verwijzen naar een type null-waarde met een onderliggend type T in een van de volgende uitwisselbare formulieren: Nullable<T> of T?.

Gebruik doorgaans een type null-waarde wanneer u de niet-gedefinieerde waarde van een onderliggend waardetype moet weergeven. Een Booleaanse waarde of boolvariabele kan bijvoorbeeld alleen true een of false. In sommige toepassingen kan een variabele waarde echter niet gedefinieerd of ontbreken. Een databaseveld kan bijvoorbeeld een waarde bevatten of false, of het kan helemaal geen waarde bevattentrue, dat wil NULLgezegd. U kunt het bool? type in dat scenario gebruiken.

Declaratie en toewijzing

Omdat een waardetype impliciet wordt omgezet in het overeenkomstige type null-waarde, kunt u een waarde toewijzen aan een variabele van een type null-waarde zoals u dat doet voor het onderliggende waardetype. U kunt ook de null waarde toewijzen. Voorbeeld:

double? pi = 3.14;
char? letter = 'a';

int m2 = 10;
int? m = m2;

bool? flag = null;

// An array of a nullable value type:
int?[] arr = new int?[10];

De standaardwaarde van een type null-waarde vertegenwoordigt null. Het is een exemplaar waarvan Nullable<T>.HasValue de eigenschap retourneert false.

Onderzoek van een exemplaar van een type null-waarde

Als u een exemplaar van een type null-waarde wilt null controleren en een waarde van een onderliggend type wilt ophalen, gebruikt u de is operator met een typepatroon:

int? a = 42;
if (a is int valueOfA)
{
    Console.WriteLine($"a is {valueOfA}");
}
else
{
    Console.WriteLine("a does not have a value");
}
// Output:
// a is 42

U kunt altijd de volgende alleen-lezen eigenschappen gebruiken om een waarde van een variabele van het type null-waarde te controleren en op te halen:

In het volgende voorbeeld wordt de HasValue eigenschap gebruikt om te controleren of de variabele een waarde bevat voordat deze wordt weergegeven:

int? b = 10;
if (b.HasValue)
{
    Console.WriteLine($"b is {b.Value}");
}
else
{
    Console.WriteLine("b does not have a value");
}
// Output:
// b is 10

U kunt ook een variabele van een type null-waarde vergelijken met null in plaats van de HasValue eigenschap te gebruiken, zoals in het volgende voorbeeld wordt weergegeven:

int? c = 7;
if (c != null)
{
    Console.WriteLine($"c is {c.Value}");
}
else
{
    Console.WriteLine("c does not have a value");
}
// Output:
// c is 7

Conversie van een waardetype met null-waarde naar een onderliggend type

Als u een waarde van een type null-waarde wilt toewijzen aan een variabele voor een niet-null-waardetype, moet u mogelijk de waarde opgeven die moet worden toegewezen in plaats van null. Gebruik hiervoor de operator ??null-coalescing. U kunt de Nullable<T>.GetValueOrDefault(T) methode ook gebruiken voor hetzelfde doel:

int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}");  // output: b is 28

int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}");  // output: d is -1

Als u de standaardwaarde van het onderliggende waardetype in plaats van nullwilt gebruiken, gebruikt u de Nullable<T>.GetValueOrDefault() methode.

U kunt ook expliciet een type null-waarde naar een niet-null-type casten, zoals in het volgende voorbeeld wordt weergegeven:

int? n = null;

//int m1 = n;    // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null

Als de waarde van een type null-waarde in runtime is null, genereert de expliciete cast een InvalidOperationException.

Een niet-null-waardetype T wordt impliciet omgezet in het bijbehorende type T?null-waarde.

Opgetilde operatoren

Een waardetype T? dat null kan worden gebruikt, ondersteunt de vooraf gedefinieerde unaire en binaire operatoren of eventuele overbelaste operators die door een waardetype T worden ondersteund. Deze operators, ook wel lifted operators genoemd, retourneren null als een of beide operanden zijn null. Anders gebruikt de operator de ingesloten waarden van de operanden om het resultaat te berekenen. Voorbeeld:

int? a = 10;
int? b = null;
int? c = 10;

a++;        // a is 11
a = a * c;  // a is 110
a = a + b;  // a is null

Notitie

Voor het bool? type voldoen de vooraf gedefinieerde & operatoren | niet aan de regels die in deze sectie worden beschreven: het resultaat van een operatorevaluatie kan niet null zijn, zelfs als een van de operanden is null. Zie de sectie Logische Booleaanse operatoren van het artikel Booleaanse logische operators voor meer informatie.

Voor de vergelijkingsoperatoren< , ><=en , als >=een of beide operanden zijn null, is falsehet resultaat . Anders worden de ingesloten waarden van operanden vergeleken. Neem niet aan dat omdat een bepaalde vergelijking (bijvoorbeeld ) retourneert false, de tegenovergestelde vergelijking (>) retourneert true. <= In het volgende voorbeeld ziet u dat 10 is

  • niet groter dan of gelijk aan null
  • niet kleiner dan null
int? a = 10;
Console.WriteLine($"{a} >= null is {a >= null}");
Console.WriteLine($"{a} < null is {a < null}");
Console.WriteLine($"{a} == null is {a == null}");
// Output:
// 10 >= null is False
// 10 < null is False
// 10 == null is False

int? b = null;
int? c = null;
Console.WriteLine($"null >= null is {b >= c}");
Console.WriteLine($"null == null is {b == c}");
// Output:
// null >= null is False
// null == null is True

Als beide operanden voor de gelijkheidsoperator== zijn null, is truehet resultaat . Als slechts één van de operanden is, is nullfalsehet resultaat . Anders worden de ingesloten waarden van operanden vergeleken.

Als beide operanden voor de ongelijkheidsoperator!= zijn null, is falsehet resultaat . Als slechts één van de operanden is, is nulltruehet resultaat . Anders worden de ingesloten waarden van operanden vergeleken.

Als er een door de gebruiker gedefinieerde conversie bestaat tussen twee waardetypen, kan dezelfde conversie ook worden gebruikt tussen de bijbehorende typen null-waarden.

Boksen en uitpakken

De volgende regels zijn van toepassing wanneer u een exemplaar van een type null-waarde T?opgeeft:

  • Als HasValue het resultaat wordt falsegeretourneerd, retourneert de boksbewerking de null-verwijzing.
  • Als HasValue het resultaat wordt geretourneerd, wordt met de boksbewerking truede bijbehorende waarde van het onderliggende waardetype T, niet het exemplaar van Nullable<T>.

U kunt een waarde in een vak van een waardetype T opheffen voor het bijbehorende type T?null-waarde, zoals in het volgende voorbeeld wordt weergegeven:

int a = 41;
object aBoxed = a;
int? aNullable = (int?)aBoxed;
Console.WriteLine($"Value of aNullable: {aNullable}");

object aNullableBoxed = aNullable;
if (aNullableBoxed is int valueOfA)
{
    Console.WriteLine($"aNullableBoxed is boxed int: {valueOfA}");
}
// Output:
// Value of aNullable: 41
// aNullableBoxed is boxed int: 41

Een type null-waarde identificeren

In het volgende voorbeeld ziet u hoe u kunt bepalen of een System.Type exemplaar een samengesteld null-waardetype vertegenwoordigt, dat wil weten het System.Nullable<T> type met een opgegeven typeparameter T:

Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} value type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non-nullable")} value type");

bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;

// Output:
// int? is nullable value type
// int is non-nullable value type

Zoals in het voorbeeld wordt weergegeven, gebruikt u de typeof-operator om een System.Type exemplaar te maken.

Als u wilt bepalen of een exemplaar van een null-waardetype is, gebruikt u de Object.GetType methode niet om een Type exemplaar op te halen om te testen met behulp van de voorgaande code. Wanneer u de Object.GetType methode aanroept op een exemplaar van een type null-waarde, wordt het exemplaar in een vak geplaatst.Object Omdat boksen van een niet-null-exemplaar van een type null-waarde gelijk is aan het boksen van een waarde van het onderliggende type, GetType retourneert een Type exemplaar dat het onderliggende type van een null-waardetype vertegenwoordigt:

int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32

Gebruik ook niet de operator is om te bepalen of een exemplaar van een null-waardetype is. Zoals in het volgende voorbeeld wordt weergegeven, kunt u met behulp van de operator geen typen van een exemplaar van een null-waardetype en het is onderliggende typeexemplaren onderscheiden:

int? a = 14;
if (a is int)
{
    Console.WriteLine("int? instance is compatible with int");
}

int b = 17;
if (b is int?)
{
    Console.WriteLine("int instance is compatible with int?");
}
// Output:
// int? instance is compatible with int
// int instance is compatible with int?

Gebruik in plaats daarvan de Nullable.GetUnderlyingType methode uit het eerste voorbeeld en de typeof-operator om te controleren of een exemplaar van een null-waardetype is.

Notitie

De methoden die in deze sectie worden beschreven, zijn niet van toepassing op null-referentietypen.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie ook