Привет, дорогой мой читатель. Наверняка, если вы часто пишете на .net, то очень часто сталкивались с методом FirstOrDefault из пространства имён System.Linq.
Метод выполняет очевидную задачу, однако есть у него не самая очевидная проблема. Метод FirstOrDefault в LINQ может стать источником путаницы. Он возвращает первый элемент последовательности или значение по умолчанию для типа, если элементов нет. Для ссылочных типов и Nullable<T> это null, а для значимых типов (например, short, int, double и т.д.) — это их дефолтное значение (0, false и т.д.).
Например, вызов FirstOrDefault для пустого списка List<short> вернёт 0, что может быть неожиданно, если 0 имеет смысловое значение в вашем коде.
var numbers = new List<short> { };
var result = numbers.FirstOrDefault();
Console.WriteLine(result); // Программа выведет: 0 Чтобы избежать такой ошибки, рекомендуется явно проверять коллекцию на присутствие элементов перед вызовом метода или использовать DefaultIfEmpty, чтобы задать своё значение по умолчанию. Например:
var result = numbers.DefaultIfEmpty(null).FirstOrDefault(); Таким образом мы можем гарантировать, что даже для пустой коллекции результат будет null, а не дефолтное значение используемого типа. Такой подход делает код понятным и избавляет от скрытых проблем с обработкой "пустых" результатов. Также метод DefaultIfEmpty можно и нужно применять в Linq-выражениях запросов к базе данных, когда требуется связать 2 таблицы левым соединением.
Источники:
1) https://learn.microsoft.com/ru-ru/dotnet/api/system.linq.enumerable.firstordefault?view=net-9.0