这是一个普遍的问题(但是我正在使用C#),最好的方法是什么(最佳实践),对于以集合为返回类型的方法,您是否返回null或空集合?
#1楼
我想在这里举例说明。
在这里考虑一个案例。
int totalValue = MySession.ListCustomerAccounts()
.FindAll(ac => ac.AccountHead.AccountHeadID
== accountHead.AccountHeadID)
.Sum(account => account.AccountValue);
在这里考虑我正在使用的功能..
1. ListCustomerAccounts() // User Defined
2. FindAll() // Pre-defined Library Function
我可以轻松地使用ListCustomerAccount和FindAll代替。
int totalValue = 0;
List custAccounts = ListCustomerAccounts();
if(custAccounts !=null ){
List custAccountsFiltered =
custAccounts.FindAll(ac => ac.AccountHead.AccountHeadID
== accountHead.AccountHeadID );
if(custAccountsFiltered != null)
totalValue = custAccountsFiltered.Sum(account =>
account.AccountValue).ToString();
}
注意:由于AccountValue不为null ,所以Sum()函数将不会返回null 。,因此我可以直接使用它。
#2楼
空集合。 总是。
这很烂:
if(myInstance.CollectionProperty != null)
{
foreach(var item in myInstance.CollectionProperty)
/* arrgh */
}
最好的做法是在返回集合或可枚举null时永远不要返回null 。 总是返回一个空的可枚举/集合。 它可以防止上述的废话,并防止您的汽车被班上的同事和用户所困扰。
在谈论属性时,请始终设置一次属性,然后忘记它
public List Foos {public get; private set;}
public Bar() { Foos = new List(); }
在.NET 4.6.1中,您可以将其压缩得很多:
public List Foos { get; } = new List();
当谈论返回可枚举的方法时,您可以轻松地返回一个空的可枚举而不是null 。
public IEnumerable GetMyFoos()
{
return InnerGetFoos() ?? Enumerable.Empty();
}
使用Enumerable.Empty()可以被认为比返回例如新的空集合或数组更有效。
#3楼
返回null可能更有效,因为不会创建新对象。 但是,它通常也需要进行null检查(或异常处理)。
从语义上讲, null和空列表并不意味着同一件事。 差异是细微的,在特定情况下,一种选择可能会比另一种更好。
无论您选择哪种方式,都要记录在案,以免造成混淆。
#4楼
取决于您的合同和具体情况 。 通常,最好返回空集合 ,但有时( 很少 ):
null可能意味着更具体;
您的API(合同)可能会迫使您返回null 。
一些具体的例子:
一个UI组件(来自控件之外的库),如果传递了一个空集合,则可能正在呈现一个空表,如果传递了null,则可能根本没有表。
在Object-to-XML(JSON / whatever)中,其中null表示元素丢失,而空集合则表示冗余(可能不正确)
您正在使用或实现一个API,该API明确指出应返回/传递null
#5楼
如果一个空集合在语义上有意义,那就是我希望返回的内容。 为GetMessagesInMyInbox()返回空集合将传达“您的收件箱中确实没有任何消息”,而返回null可能对传达可用数据不足以说明可能返回的列表应该是什么样子很有用。