IEnumerable null合并扩展
在经过foreach或LINQ查询迭代之前,我经常面临检查IEnumerable
是否为null的问题,然后我经常会遇到这样的代码:
var myProjection = (myList ?? Enumerable.Empty()).Select(x => x.Foo)...
因此,我想将此扩展方法添加到Extensions类:
public static class MyExtensions { public static IEnumerable AsEmptyIfNull(this IEnumerable source) { return source ?? Enumerable.Empty(); } }
在我看来这个代码时会立即出现一个小问题,即,考虑到扩展方法的“实例方法方面” ,它应该仅仅作为一个静态方法来实现,否则这样的东西是完全合法的:
IEnumerable list = null; list.AsEmptyIfNull();
你看到使用它有任何其他缺点吗?
如果大量使用,这种扩展会导致开发人员出现某种不良趋势吗?
奖金问题:
你能建议一个更好的名字吗? :)
(英语不是我的第一语言,那么我在命名方面不太好…)
提前致谢。
返回IEnumerable
应该返回一个空的,而不是null。 所以你不需要这个。
看到这个问题: 返回null或空集合是否更好?
否则,您的代码似乎没问题。
如果可以控制它,返回null
而不是空序列通常是个坏主意。 如果您考虑到有人被要求生成一个集合时,这是不言自明的,返回null
并不像是说“集合是空的”,而是“根本没有这样的集合”。
如果你拥有返回枚举的方法,那么返回一个空的IEnumerable
(它甚至可以是一个特殊用途的只读静态对象,如果它可能会被大量返回)是要走的路,期间。
如果你被迫使用一个习惯在这种情况下返回null
的坏人库,那么这个扩展方法可能是一个解决方案,但我再也不喜欢它了。 在你自己的版本中包含坏人方法可能会更好,这些方法会在人们看不到它的情况下进行合并。 通过这种方式,您可以获得始终具有可枚举而非null
的便利性以及不支持“return null”范例的正确性。