IEnumerable<T> null coalescing Extension
本文关键字:coalescing Extension null lt IEnumerable gt | 更新日期: 2023-09-27 17:50:03
我经常遇到在通过foreach或LINQ查询迭代IEnumerable<T>
是否为空之前检查它的问题,然后我经常遇到这样的代码:
var myProjection = (myList ?? Enumerable.Empty<T>()).Select(x => x.Foo)...
因此,我想将此扩展方法添加到扩展类中:
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();
您看到使用它还有其他缺点吗?
如果大量使用,这种扩展会导致开发人员出现某种不良趋势吗?
奖金问题:
你能建议一个更好的名字吗? :)
(英语不是我的第一语言,那么我不太擅长命名...
提前谢谢。
返回IEnumerable<T>
的方法应返回空方法,而不是 null。所以你不需要这个。
看到这个问题:返回空集合还是空集合更好?
否则,您的代码似乎没问题。
如果可以控制,返回null
而不是空序列通常是一个坏主意。如果您考虑到当某人被要求制作一个集合时,返回null
不像说"集合是空的",而是"根本没有这样的集合",这是不言自明的。
如果您拥有返回枚举项的方法,那么返回一个空IEnumerable
(如果可能返回很多,它甚至可以是一个特殊用途的只读静态对象(是要走的路,句号。
如果您被迫使用在这种情况下习惯于返回null
的不礼貌库,那么这种扩展方法可能是一种解决方案,但我又不喜欢它。最好将不礼貌的方法包装在您自己的版本中,这些方法在人们看不到的地方进行合并。这样,您既可以获得始终具有可枚举而不是null
的便利,又可以获得不支持"返回 null"范式的正确性。