C# Language
Nollvillkorade operatörer
Sök…
Syntax
- X .Y; // null om X är noll annars XY
- ? X .Y .Z; // null om X är noll eller Y är noll annars XYZ
- X [index]?; // null om X är noll annars X [index]
- X .ValueMethod (); // null om X är noll annars är resultatet av X.ValueMethod ();
- X .VoidMethod (); // gör ingenting om X är noll annars ring X.VoidMethod ();
Anmärkningar
Observera att när du använder nollkoalesceringsoperatören på en värdetyp T
kommer du att få en Nullable<T>
tillbaka.
Noll-villkorad operatör
?.
operatören är syntaktiskt socker för att undvika fullständiga nollkontroller. Det är också känt som Safe navigation operator .
Klass som används i följande exempel:
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public Person Spouse { get; set; }
}
Om ett objekt potentiellt är noll (till exempel en funktion som returnerar en referenstyp) måste objektet först kontrolleras för null för att förhindra en eventuell NullReferenceException
. Utan den nollvillkorade operatören skulle detta se ut:
Person person = GetPerson();
int? age = null;
if (person != null)
age = person.Age;
Samma exempel med den nollvillkorade operatören:
Person person = GetPerson();
var age = person?.Age; // 'age' will be of type 'int?', even if 'person' is not null
Kedja operatören
Den nollvillkorade operatören kan kombineras på ett objekts medlemmar och undermedlemmar.
// Will be null if either `person` or `person.Spouse` are null
int? spouseAge = person?.Spouse?.Age;
Kombination med Null-Coalescing Operator
Operatören med nollvillkor kan kombineras med operatören nollkoaliserande för att tillhandahålla ett standardvärde:
// spouseDisplayName will be "N/A" if person, Spouse, or Name is null
var spouseDisplayName = person?.Spouse?.Name ?? "N/A";
Noll-villkorligt index
På samma sätt som ?.
operatören, kontrollerar den nollvillkorade indexoperatören efter nollvärden vid indexering i en samling som kan vara noll.
string item = collection?[index];
är syntaktiskt socker för
string item = null;
if(collection != null)
{
item = collection[index];
}
Undvika NullReferenceExceptions
var person = new Person
{
Address = null;
};
var city = person.Address.City; //throws a NullReferenceException
var nullableCity = person.Address?.City; //returns the value of null
Denna effekt kan kedjas ihop:
var person = new Person
{
Address = new Address
{
State = new State
{
Country = null
}
}
};
// this will always return a value of at least "null" to be stored instead
// of throwing a NullReferenceException
var countryName = person?.Address?.State?.Country?.Name;
Noll-villkorad operatör kan användas med förlängningsmetod
Extensionsmetod kan fungera på nollreferenser , men du kan använda ?.
att ändå nollkontrollera.
public class Person
{
public string Name {get; set;}
}
public static class PersonExtensions
{
public static int GetNameLength(this Person person)
{
return person == null ? -1 : person.Name.Length;
}
}
Normalt utlöses metoden för null
och returnerar -1:
Person person = null;
int nameLength = person.GetNameLength(); // returns -1
Använder ?.
metoden kommer inte att triggas för null
, och typen är int?
:
Person person = null;
int? nameLength = person?.GetNameLength(); // nameLength is null.
Detta beteende förväntas faktiskt från det sätt på vilket ?.
operatören fungerar: den kommer att undvika att NullReferenceExceptions
för att undvika NullReferenceExceptions
. Men samma logik gäller förlängningsmetoden, trots skillnaden i hur metoden deklareras.
För mer information om varför tilläggsmetoden kallas i det första exemplet, se tilläggsmetoderna - nollkontroll dokumentation.