Операторы ?? и ??= позволяют создавать более понятный и удобочитаемый код.
[Оператор ??]
Оператор пустого объединения ?? (null-coalescing operator) возвратит значение левого операнда, если оно не null. Иначе будет вычислено и возвращено значение правого операнда ??. Оператор ?? не вычисляет свой правый операнд, если левый операнд не null.
результат = левыйоперанд ?? правыйоперанд;
Пример:
public static void Create (string IniPath = null)
{
Path = new FileInfo(IniPath ?? EXE + ".ini").FullName.ToString();
}
Начиная с версии C# 7.3, тип левого операнда оператора ?? должен быть либо ссылочным типом, либо типом, для которого допустимо значние null. Начиная с версии C# 8.0, это требование заменено на другое: тип левого операнда операторов ?? и ??= не может иметь тип, для которого не допускается значение null. В частности, начиная с версии 8.0, можно использовать операторы ?? и ??= для неограниченного типа (т. е. даже шаблона):
private static void Display< T>(T a, T backup)
{
Console.WriteLine(a ?? backup);
}
[Оператор ??=]
Оператор присваивания ??= (появился начиная с версии C# 8.0) установит свой левый операнд в значение правого операнда, только если левый операнд вычисляется как null. Оператор?? = не вычисляет правый операнд, если левый операнд имеет значение, отличное от null.
леваыйоперанд ??= правыйоперанд;
Пример:
List< int> списокчисел = null;
int? a = null;
(списокчисел ??= new List< int>()).Add(5);
Console.WriteLine(string.Join(" ", списокчисел)); // выведется: 5
numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", списокчисел)); // выведется: 5 0
Console.WriteLine(a); // выведется: 0
[Правила использования]
Левый операнд оператора ??= должен быть переменной, свойством или индексером.
Операторы ?? и ??= имеют правую ассоциативность. Т. е. выражения формы:
a ?? b ?? c d ??= e ??= f
будут вычислены в следующем порядке:
a ?? (b ?? c) d ??= (e ??= f)
Операторы ?? и ??= не могут быть перегружены.
Пример 1. В выражениях с null-условными операторами ?. и ?[] можно использовать оператор ??, чтобы предоставить для вычисления альтернативное выражение в случае, когда результат вычисления выражения с null-условными операторами равен null:
double СуммаЧисел(List< double[]> наборЧисел, int ИндексНабораДляСуммы)
{
return наборЧисел?[ИндексНабораДляСуммы]?.Sum() ?? double.NaN;
}
var сумма = СуммаЧисел(null, 0);
Console.WriteLine(сумма); // выведется: NaN
Пример 2. Когда Вы работаете с типами, для которых допускаются значения null (nullable-тип), и нужно предоставить значение для значения базового типа, используйте оператор ??, чтобы указать значение для случая, когда значение nullable-типа равно null:
int? a = null;
int b = a ?? -1;
Console.WriteLine(b); // выведется: -1
Применяйте метод Nullable< T>.GetValueOrDefault() если значение, используемое для null-значения nullable-типа должно получить значение по умолчанию базового типа.
Пример 3. Начиная с версии C# 7.0 можно использовать выражение throw в качестве правого операнда оператора ??, чтобы сделать код проверки аргумента более лаконичным. Здесь также демонстрируется, как использовать элементы, основанные на выражениях, для определения свойства:
public string Name
{
get => name;
set => name = value ??
throw new ArgumentNullException(nameof(value),
"Имя не может быть null");
}
Пример 4. Начиная с версии C# 8.0 можно использовать оператор ??= для упрощения кода. Например, следующий блок кода заменяется простым оператором:
if (variable is null)
{
variable = expression;
}
// Можно заменить на выражение:
variable ??= expression;
[Ссылки]
1. ?? and ??= operators (C# reference) site:docs.microsoft.com. 2. C#: символы @ и $ перед строкой. |