簡體   English   中英

返回IEnumerable <T> 或轉換為列表 <T> 立即?

[英]Return IEnumerable<T> or convert to List<T> immediately?

我正在設計一個帶有幾個返回對象列表的函數的類。 我注意到將IEnumerable<T>轉換為List<T>時,調試變得更加容易,因為可以在“監視”窗口中查看對象。 但是,對於IEnumerable ,我不確定這是否是最佳實踐。

問:哪個更好?

public IEnumerable<MyData> GetData()
{
    return Foo();
}

public IEnumerable<MyData> GetData()
{
    return Foo().ToList();
}

好的做法-除非有充分的理由/必要,否則不要工作。 因此,除非您有特殊原因-只需返回IEnumerable<MyData>而不在其上調用ToList()/ ToArray()即可。

潛在原因:

  • 函數有望完成對潛在延遲枚舉的評估
  • 您希望結果被多次枚舉

最好將IEnumerable<..>作為更通用的類型返回。 之后, 呼叫者可以決定如何處理它。 您的情況下,在兩種情況下都返回IEnumerable<..> ,因此沒有任何理由運行ToLIst() ,只需返回IEnumerable

這確實取決於您的要求。 方法簽名的返回類型也是該方法合同的一部分。 返回IEnumerable的方法表示值流,而返回List(或更抽象的Collection)的方法則返回可變的值集合。

我通常會嘗試遵循以下做法。

  • 當沒有固定的值數量知識或在哪里加載所有值將花費大量時間/資源(例如查詢結果)時,請嘗試使用IEnumerable或IObservable傳輸數據。
  • 將數組用於事先已知的不可變的固定集。
  • 將ICollection用於可以更改的預先已知的固定集。

如果您要使用將要處理的工作單元,則最好使用元素列表,因為一旦處理了該元素,您將無法再獲取元素。

在所有其他情況下,可以返回通用IEnumerable ,因為它提供了更好的靈活性。

最后,一切都取決於您的要求,請注意IEnumnerable不會在分配給變量的確切時刻而是在枚舉時檢索元素。

IEnumerable<T>向調用方提供IEnumerable<T>集合的協定。但是,當您使用IList<T>List<T> ,建議它們可以直接添加或刪除元素(而無需通過任何方法,例如添加或注冊您的類實現中可能包含的內容)。 如果您只是想讓調用者看到“項目”,則IEnumerable是更好的合同。

雖然不是100%,但我將IEnumerable返回值視為只讀集合。

易於調試應該是良好設計的第二要務。 我建議您僅對類進行單元測試,而不要依賴於能夠在運行時窺視內部。 但是,在大多數情況下,調試器將'base'類顯示為第一項。 因此,IEnumerable的第一項是您實際上在內部使用的列表。 只需要再一次“展開”即可看到成員!

返回IEnumerable可以使調用方決定如何處理結果-枚舉結果或將其傳遞給其他內容而無需枚舉當前值。 ToList()強制將此時要枚舉的數據放入列表,然后將其傳遞給調用方。

因此,IEnumerable很可能是兩者中最好的-但是調試時使用ToList會更容易。

有一個簡單的規則:返回更多conrette,接受更多泛型。

如果您的返回值確實是IEnumerable<>原樣返回它。 但絕對不要這樣做:

public IEnumerable<MyData> GetData()
{
    return this.list; // list = new List<MyData>();
}

上面的代碼無需任何限制即可限制調用方。 這將是一個列表,並且調用者無論如何都可以將其強制轉換為列表並清除它。

暫無
暫無

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

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