[...]我想保留集合類爲每個,把它們作爲屬性而不是使用索引。這聽起來正確嗎?
是的,這聽起來比索引器更好,因爲它可以提供更好的類型安全性。如果你公開一個普通的集合,它們每個都可以有自己的元素類型。使用索引器,您將被迫爲所有公開的集合選擇相同的集合類型。爲了說明這個事實:
public DataTable this[string tableName] { ... }
// ^^^^^^^^^
// choose one, unspecific type for all exposed collections
vs.
public IList<Customer> Customers { get { ... } }
public IList<Supplier> Suppliers { get { ... } }
// ^^^^^^^^
// the right type for each collection
所以是的,確實顯示單個「類型」集合,而不是「無類型」集合集合。
旁註:你說你要允許隧道;有些人可能會告訴你,這違反了一些常用舉行OO原則,如單一職責原則(SRP),或關注(SoC)的分離。
public class Db
{
public IList<Customer> Customers { get { ... } }
...
}
「包含的對象」可能意味着這裏兩件事情:
例如:與
private List<Customer> customers = new List<Customer>();
//^for class-internal use only
public IList<Customer> Customers { get { return this.customers.AsReadOnly(); } }
// ^^^^^^^^^^^^^
// expose collection as read-only
這又可能意味着兩兩件事:
你db
公開收藏數沒有限制。顯然,當你希望每個集合都是專門輸入時,這是行不通的。當你所有的收藏品都暴露具有相同類型(例如,作爲DataTable
S,或作爲非通用ICollection
S)這隻作品,您將需要提供一個索引。也就是說,您可以通過索引器公開的一個集合來訪問您的許多集合。
您公開了一個衆所周知且數量有限的集合(例如Customers
,Suppliers
等)。然而,每個這些都可以包含儘可能多的子對象。當我編寫了我的答案的上述部分時,我假設了這種情況。當您進行隧道工程時,優勢在於更好的類型安全性和編譯時檢查。
關於最後一點:
db.Customers["John Smith"].BillingAddress
與
db.Tables["Customers"].Rows["John Smith"].Columns["BillingAddress"] as Address
在第一種情況中,編譯器可以檢查類型,如Customers
,BillingAddress
性質的,而在第二種情況,這些屬性被編碼爲字符串,編譯器不會注意到你是否有拼寫錯誤。另外,您必須使用類型轉換自己指出正確的數據類型。
我編輯了我的問題,希望澄清哪些索引器可能暗示或不暗示。謝謝。 – onedaywhen 2010-09-17 09:03:36
是的,你明白了。沒有問題,你可以簡單地使用db.StoredProcs [「blah」],就像使用db.Tables []一樣。索引器位於StoredProcs集合中。自動如果您使用.NET集合類。 – 2010-09-17 09:20:36