簡體   English   中英

IEnumerable類型的C#屬性

[英]C# property of type IEnumerable

我有一個名為ContainerQuery實用程序小類,它由零個或多個ContainerQueryClause對象組成。 在用戶准備好查詢(即添加了一些子句)之后,我框架的接口需要獲取一個支持以下內容的對象:

interface IContainerQuery
{
    public IEnumerable<ContainerQueryClause> Clauses { get; }
}

什么是IContainerQuery的最佳實現,為什么?

選項a)

class ContainerQuery
{
   public IEnumerable<ContainerQueryClause> Clauses { get; set; }
}

選項b)

class ContainerQuery
{
    public ContainerQuery()
    {
        Clauses = new List<ContainerQueryClause>();
    }

    public ICollection<ContainerQueryClause> Clauses { get; private set; }
}

選項c)

class ContainerQuery
{
    public ContainerQuery(IEnumerable<ContainerQueryClause> clauses)
    {
        Clauses = clauses;
    }

    public IEnumerable<ContainerQueryClause> Clauses { get; private set; }
}

選項d)

上述方法的組合或完全不同的方法。

旁注1:盡管ContainerQuery當前看起來像“ 它是一個可枚舉的子句”,但我還是希望為將來建模,因為“ 具有一個可枚舉的子句”。

問:是否存在創建IEnumerable<T>類型的屬性的一般最佳實踐/模式? 如果沒有,哪種方法適合哪種情況?

附帶問題:您是否將創建接口IContainerQuery以使內部框架僅使用不可變版本,還是會因為“您的內部代碼不夠愚蠢而無法在以后更改查詢”而拒絕這樣做?


其他一些上下文:用戶實例化一個新的容器查詢,並希望添加一些子句。 沒有時髦流暢的界面或類似的東西。 將完成的查詢傳遞給我的框架后,我的框架只希望讀取所有子句,並且不允許對其進行任何更改(按接口描述)。

從以下實現開始。 為什么? 它為呼叫者提供了最少的知識和可能性。

  • 您可以將類與默認構造函數一起使用=>無需考慮參數會發生什么
  • 子句始終被初始化=>無需檢查null
  • 子句是IEnumerable =>最小的功能集,內部表示的最大靈活性

如果您可以接受實施,那么您就完成了。 如果您認為沒有子句的ContainerQuery沒有意義,請將其添加到構造函數中,以便調用者被迫提供一個值。 如果建議調用者使用此接口,則需要ICollection中的某些方法(在構造ContainerQuery之后添加/刪除)。 等等 ...

public class ContainerQuery : IContainerQuery
{
  public ContainerQuery()
  {
    Clauses = new List<ContainerQueryClause>();
  }

  public IEnumerable<ContainerQueryClause> Clauses { get; private set; }
}

暫無
暫無

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

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