簡體   English   中英

.NET C#數組實例化/傳遞理論

[英].NET C# Array Instantiation/Passing Theory

我有一個特殊的對象,其中包含一個對象列表和該列表的許多附帶屬性。

我有一個將項目注入到我的特殊對象的列表部分中的功能。 該函數取決於列表附帶的屬性,因此我選擇創建一個同時包含屬性和列表的新對象。

問題1:在函數開始注入項目之前,誰負責確保List不為空?

  1. 調用者是否應該創建一個新列表並將其傳遞給函數?

  2. 被調用者是否應該創建一個新列表並將其分配給該對象,而不管傳入對象的狀態如何?

  3. 該函數是否應該設計成可以接受該對象並返回一個新列表,而無需修改該對象,而是將其留給調用者以將返回的列表分配給它的特殊對象?

還是...還有其他我沒有考慮的選擇?

相關問題2:鑒於我的設計需要List附帶的屬性,我應該選擇創建一個同時包含屬性和List的新類,還是應該創建一個創建List的子類來保存其他屬性?

簡而言之,從概念上講,包含列表的對象負責使用一種有效的方式來存儲數據,這意味着它應該在需要時負責實例化其列表。

如果對象設計為表示對象的集合,則它負責維護內部實際用於存儲對象的任何內容,除非目標的一部分是使新對象成為多種類型的集合的“包裝器”,允許根據內部使用的集合類型自定義行為。

考慮一個列表。 它在內部使用一個數組來存儲數據,並處理所述數組的大小以存儲可能需要的新對象。 您不必了解列表。 從概念上講,它是一個有序的,索引編制的集合,允許插入和刪除元素。 它可以用鏈表,紅黑樹或其他任何東西來實現。 這些將對性能和復雜性產生影響。

回到正題。 您的對象應該是具有其他屬性的List,應該隱藏其內部數據結構。 用戶不需要知道那里的元素列表。 這意味着您的對象應該知道如何實例化其自己的內部數據結構,並公開調用者將用來注入新元素的方法,這些元素將作用於內部列表。

一個例外是“包裝器”的例外,該包裝器增加了可應用於其他類的子集中任何一個的新功能,並且重要的是允許用戶指定在特定用法中應將新類“包裝”到哪個類。 一個示例是BlockingCollection。 它增加了阻止對集合執行並發操作的線程的能力,直到它有效且安全地執行該操作為止(例如,如果集合為空,則嘗試從BlockingCollection獲取項目的線程將被阻止,直到另一個線程添加了一些東西)。 創建后,您可以指定BlockingCollection使用IProducerConsumerCollection接口的特定實現。 很有可能是同一名稱空間中的內置“並發”集合之一,例如ConcurrentBag,ConcurrentQueue或ConcurrentDictionary。 即使在這種情況下,也有一個“默認”選項。 您可以實例化BlockingCollection對象,而無需指定要使用的內部Concurrent結構,並且該對象將默認為ConcurrentQueue。

假設你的列表您的類的實例的領域/成員,我會建議new ING在類的構造函數列表。

public class SpecialObject
{
    List<something> myList;
    public SpecialObject()
    {
        myList = new List<something>();
    }
}

或者在沒有構造函數的情況下完成同樣的事情:

public class SpecialObject
{
    List<something> myList = new List<something>();
}

暫無
暫無

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

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