IEnumerable<T> нулевое объединяющее расширение
Я часто сталкиваюсь с проблемой, чтобы проверить, IEnumerable<T>
равен нулю, прежде чем выполнять итерацию через запросы foreach или LINQ, тогда я часто сталкиваюсь с такими кодами:
var myProjection = (myList ?? Enumerable.Empty<T>()).Select(x => x.Foo)...
Следовательно, я подумал добавить этот метод extension в класс Extensions:
public static class MyExtensions
{
public static IEnumerable<T> AsEmptyIfNull<T>(this IEnumerable<T> source)
{
return source ?? Enumerable.Empty<T>();
}
}
Когда я смотрю на этот код, сразу возникает небольшая проблема, т. Е. Учитывая "аспект методов экземпляра" методов расширения, он должен быть реализован как простой статический метод, иначе что-то вроде этого было бы совершенно законно:
IEnumerable<int> list = null;
list.AsEmptyIfNull();
Видите ли вы какой-либо другой недостаток в его использовании?
Может ли такое расширение привести к какой-то плохой тенденции в разработчике (ях), если широко используется?
Бонусный вопрос:
Можете ли вы предложить лучшее имя для него? :)
(Английский не мой родной язык, тогда я не так хорош в названии...)
Заранее спасибо.
2 ответа
Методы, которые возвращают IEnumerable<T>
должен вернуть пустой, а не ноль. Так что тебе это не понадобится.
Смотрите этот вопрос: лучше ли вернуть пустую или пустую коллекцию?
В противном случае ваш код выглядит нормально.
Как правило, плохая идея вернуть null
вместо пустой последовательности, если вы можете контролировать это. Это говорит само за себя, если вы считаете, что когда кого-то просят создать коллекцию, возвращаются null
это не то же самое, что сказать "коллекция пуста", но "такой коллекции нет вообще".
Если у вас есть методы, возвращающие перечислимые значения, то возвращаются пустые IEnumerable
(это может быть даже статический объект специального назначения только для чтения, если он может быть возвращен много раз).
Если вы вынуждены использовать невоспитанную библиотеку, которая имеет привычку возвращаться null
в таких случаях этот метод расширения может быть решением, но опять же я бы не предпочел его. Вероятно, лучше обернуть невоспитанные методы в ваших собственных версиях, которые объединяются там, где люди этого не видят. Таким образом, вы получаете удобство всегда иметь перечислимый вместо null
и правильность того, чтобы не поддерживать парадигму "вернуть ноль".