2010-02-22 119 views
2

我再次找到出路來處理與我們的業務對象上的輔助對象列表。優點/缺點列表與子對象

事實上,我們的代碼往往看起來是這樣的:

public class Object 
{ 
    private List<SubsidiaryObject> subsidiaryObjects = null; 
    public List<SubsidiaryObject> SubsidiaryObjects 
    { 
     get 
     { 
      if (this.subsidiaryObjects == null) 
      { 
       this.subsidiaryObjects = DBClass.LoadListFromDatabase(); 
      } 

      return this.subsidiaryObjects; 
     } 

     set 
     { 
      this.subsidiaryObjects = value; 
     } 
    } 
} 

刀豆這個:

  • 該物業在表示層參考和用於數據綁定。釋放對實際列表的引用並將其替換爲新的引用將結束於GUI中的引用列表中,該引用列表中沒有任何對象上的列表。

這個臨:

  • 重裝列表的方式簡單(只需設置引用設置爲null,然後再得到它)。

我開發了採用以下模式另一個類:

public class Object2 
{ 
    private readonly List<SubsidiaryObject> subsidiaryObjects = new List<SubsidiaryObject>(); 
    public List<SubsidiaryObject> SubsidiaryObjects 
    { 
     get 
     { 
      return this.subsidiaryObjects; 
     } 
    } 

    public void ReloadSubsidiaryObjects() 
    { 
     this.SubsidiaryObjects.Clear(); 
     this.SubsidiaryObjects.AddRange(DBClass.LoadListFromDatabase()); 
    } 
} 

臨上這樣的:

  • 參考是連續的。

刀豆這個:

  • 重新加載列表是比較困難的,因爲它只是不能更換,但必須清除/填充重新加載項。

什麼是你喜歡的方式,什麼情況?

對於這些模式中的任何一種,您認爲Pro/Con是什麼?

由於這只是一個普遍問題,不是針對特定問題,所以每個答案都是值得歡迎的。

回答

2

您是否需要調用者能夠修改列表?如果不是,你應該考慮返回IEnumerable<T>ReadOnlyCollection。即使你這樣做,你可能會更好地爲Add/Remove製作封面版本,以便攔截修改。處理對內部狀態的引用不是一個好主意IMO。

第三個選項是使用選項2,但每次需要重新填充列表時,要創建Object2類型的新實例。沒有問題的附加上下文,這是我選擇的選項,但可能有一些原因會導致您想要保留原始實例。

+0

事實上,保持原始實例的主要原因是,它是一個附屬對象本身......除了頂層之外。 – 2010-02-22 13:01:33