C#: операторы ?? и ??= Печать
Добавил(а) microsin   

Операторы ?? и ??= позволяют создавать более понятный и удобочитаемый код.

[Оператор ??]

Оператор пустого объединения ?? (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#: символы @ и $ перед строкой.