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 будут вычислены в следующем порядке: a ?? (b ?? c) Операторы ?? и ??= не могут быть перегружены. Пример 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. |