簡體   English   中英

返回空列表 <T> 或沒有列表項目時為null?

[英]Return empty List<T> or null when no list items present?

當我有一個返回對象集合的方法時,如果對象計數為零,我應該返回什么? null或只是空List<T> 什么是好習慣?

public List<string> GetPupilsByClass(string className)
{
     ....
}

我肯定會返回一個空列表,因此仍然可以在對象上調用方法而無需進行空檢查。 返回空列表並且根本不返回任何內容之間存在差異,因此調用代碼可能不會期望接收空引用(除非發生異常或其他內容)。

它取決於許多因素,但空列表將是更典型的返回值,否則調用者必須知道執行null檢查。 我返回null的主要時間是它是否是這種風格的方法:

bool Try*(args, out result)

調用者期望(收到false )甚至不查看 result的值。

如果您碰巧正在返回數組 ,那么有一個很好的作弊 - 您可以將靜態字段中的零長度類型數組存儲在某處。 但最終一個空列表不會是一個巨大的分配開銷,所以只是發送它。

一個空列表是我期望作為調用者的。 Null會向我表明“概念列表”未定義,如數據庫中的null。

此外,通過始終返回空集合而不是null,像這樣的客戶端永遠不會失敗:

foreach(var element in obj.Method()) ...

根據MS,您永遠不應該從字段或屬性返回空字符串或數組,我認為這可以擴展到方法(可能是,我還沒有找到的地方)。

在返回空數組時:

String和Array屬性永遠不應返回null引用。 在這種情況下,Null很難理解。

一般規則是null,空字符串(“”)和空(0項)數組應該以相同的方式處理。 返回一個空數組而不是空引用。

MSDN參考

這種方法是一種ifc方法嗎? 這意味着外部物體不受你控制? 如果回答是,那么我將返回一個空集合,因為調用者不期待異常。

如果此方法是內部的,並且您將是唯一的用戶,我將返回null以保存為空集合分配的浪費內存以及一旦停止使用它就會觸及GC性能。

更好的做法是返回IEnumerable<string> 在方法中使用yield returnyield break來構建集合。 以這種方式,您推遲創建數組。 在這里查看更多信息。 你會發現IEnumerable的好處是它可以在擴展方法和linq查詢中鏈接:

var results = from x in GetPupilsByClass(className) where x.StartsWith("A");

如果你絕對必須返回一個完整的列表(由於yield的惰性),那么我建議你將方法簽名改為:

public bool TryGetPupilsByClass(string className, out ICollection<string> pupils)

該技術具有三個優點。

  1. 你的意圖很明確 - 如果返回值為真,學生將被初始化。 您的代碼的用戶不必猜測您已經確定了哪種做法。
  2. 在集合為空的情況下,您當然不會為分配列表煩惱,這節省了內存分配。
  3. ICollection<string>是強類型的,不會泄露您正在使用的存儲機制。 應謹慎使用返回的具體課程。 替代方案是像IList<string>ReadOnlyCollection<string>IEnumerable<string> ,但是你選擇的那個肯定會讓你對用戶能夠做什么和不能做什么的意圖更加清晰。

Allways返回emty列表。 並且您將避免最常發生的異常 - NullReferenceException

我通常遵循R.Martin的清潔代碼指南。 建議返回一個空列表:

public List GetPupilsByClass(s​​tring className){....}

我這樣做是出於以下原因:

  1. 調用方法不必檢查null。
  2. 此方法不必執行錯誤處理。
  3. 異常將以更高級別的方法捕獲。

這取決於您的代碼使用的上下文。 在大多數情況下,我返回一個零對象列表,我認為這也是最好的 - 它與您的正常結果更加一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM