5

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

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();

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


奖金问题:

你能给它推荐一个更好的名字吗? :)
(英语不是我的母语,那我的命名不太好……)

提前致谢。

4

2 回答 2

7

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

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

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

于 2011-04-12T19:18:32.670 回答
3

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

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

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

于 2011-04-12T19:27:45.497 回答