这是一个一般性的问题(但我使用c#),最好的方法(最佳实践)是什么,对于一个有集合作为返回类型的方法,你返回null集合还是空集合?
当前回答
框架设计指引第二版(第256页):
不返回空值从 集合属性或方法 返回集合。返回空 集合或空数组。
这是另一篇关于不返回null的好处的有趣文章(我试图在Brad Abram的博客上找到一些东西,他链接到了这篇文章)。
编辑-正如Eric Lippert现在对原始问题的评论,我也想链接到他的优秀文章。
其他回答
这取决于你的合同和具体情况。 通常最好返回空集合,但有时(很少):
Null可能意味着更具体的东西; 你的API(合约)可能会强制你返回null。
一些具体的例子:
一个UI组件(来自一个不受你控制的库),如果传递一个空集合,可能会呈现一个空表,或者如果传递null,则根本不呈现表。 在Object-to-XML (JSON/其他)中,null表示元素缺失,而空集合将呈现冗余(可能不正确)<collection /> 你正在使用或实现一个明确声明null应该返回/传递的API
空的对消费者更友好。
有一个明确的方法来创建一个空的枚举:
Enumerable.Empty<Element>()
返回null可能更有效,因为不会创建新的对象。然而,它也经常需要一个空检查(或异常处理)。
从语义上讲,null和空列表的意思是不同的。这些差异是微妙的,在特定的情况下,一种选择可能比另一种更好。
不管你的选择是什么,记录下来以避免混淆。
从管理复杂性(一个主要的软件工程目标)的角度来看,我们希望避免将不必要的圈复杂性传播到API的客户端。向客户端返回null就像返回另一个代码分支的圈复杂度成本。
(这对应于单元测试负担。除了空集合返回情况外,您还需要为空返回情况编写一个测试。)
框架设计指引第二版(第256页):
不返回空值从 集合属性或方法 返回集合。返回空 集合或空数组。
这是另一篇关于不返回null的好处的有趣文章(我试图在Brad Abram的博客上找到一些东西,他链接到了这篇文章)。
编辑-正如Eric Lippert现在对原始问题的评论,我也想链接到他的优秀文章。
推荐文章
- 最好的方法在asp.net强制https为整个网站?
- 什么Java 8流。收集等价物可在标准Kotlin库?
- 将字符串转换为System.IO.Stream
- 如何从枚举中选择一个随机值?
- 将Set<T>转换为List<T>的最简洁的方法
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 从另一个列表id中排序一个列表
- 等待一个无效的异步方法