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 coalescing Extension

返回IEnumerable<T>的方法应返回空方法,而不是 null。所以你不需要这个。

看到这个问题:返回空集合还是空集合更好?

否则,您的代码似乎没问题。

如果可以控制,返回null而不是空序列通常是一个坏主意。如果您考虑到当某人被要求制作一个集合时,返回null不像说"集合是空的",而是"根本没有这样的集合",这是不言自明的。

如果您拥有返回枚举项的方法,那么返回一个空IEnumerable(如果可能返回很多,它甚至可以是一个特殊用途的只读静态对象(是要走的路,句号。

如果您被迫使用在这种情况下习惯于返回null的不礼貌库,那么这种扩展方法可能是一种解决方案,但我又不喜欢它。最好将不礼貌的方法包装在您自己的版本中,这些方法在人们看不到的地方进行合并。这样,您既可以获得始终具有可枚举而不是null的便利,又可以获得不支持"返回 null"范式的正确性。