IEnumerable <t> null合并扩展</t>

时间:2011-04-12 19:15:05

标签: c# extension-methods ienumerable null-coalescing

我经常遇到问题,在通过foreach或LINQ查询迭代之前检查IEnumerable<T>是否为null,然后我经常会遇到这样的代码:

var myProjection = (myList ?? Enumerable.Empty<T>()).Select(x => x.Foo)...

因此,我想将此扩展方法添加到Extensions类:

public static class MyExtensions 
{
    public static IEnumerable<T> AsEmptyIfNull<T>(this IEnumerable<T> source)
    {
        return source ?? Enumerable.Empty<T>();
    }
}

在我的脑海中立即出现一个小问题,看看这段代码,即,给定扩展方法的“instance-methods aspect”,它应该只是一个静态方法实现,否则就是像这样是完全合法的:

IEnumerable<int> list = null;
list.AsEmptyIfNull();

您是否看到使用它有任何其他缺点? 如果大量使用,这种扩展会导致开发人员出现某种不良趋势吗?


加分问题:

你能建议一个更好的名字吗? :)
(英语不是我的第一语言,那么我在命名方面不太好......)

提前致谢。

2 个答案:

答案 0 :(得分:7)

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

请参阅此问题:Is it better to return null or empty collection?

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

答案 1 :(得分:3)

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

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

如果你被迫使用一个习惯于在这种情况下返回null的不良礼貌的图书馆,那么这种扩展方法可能是一个解决方案,但我再也不喜欢它了。最好的方法是在你自己的版本中包含那些人们不会看到它的合并方式。通过这种方式,您可以获得始终具有可枚举而不是null的便利性以及不支持“返回null”范例的正确性。