程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則40:根據需求選擇集合(4)

Effective C#原則40:根據需求選擇集合(4)

編輯:關於C語言

對於數組類的概念而言,在C#的1.x發布版中,沒有一個集合類是強類型 的。它們都是存儲的對象引用。C#的范型將會在所有這些拓撲上包含新的版本。 這會是一個最好的方法來創建類型安全的集合。同時,目前的 System.Collections 名字空間中包含了抽象的基類,利用這些基類,你可以在 類型不安全的集合上創建你自己的類型安全的接口:CollectionBase 和 ReadOnlyCollectionBase 提供了列表和向量結構的基類。DictionaryBase 提供 了鍵/值對應的基類。DictionaryBase類是建立在Hashtable上的,它的性能與 Hashtable是一致的。

(譯注:在C#1.x中,我們其實可以合建類型安全的 集合,當然這只是利用編譯器一些特性,例如:

public class MyObject
{
}
public class MyObjectCollection : ArrayList
{
 [ObsoleteAttribute("Please use specify object.",true)]
 public override int Add(object value)
 {
 return base.Add (value);
 }
 public int Add (MyObject value)
 {
 return base.Add (value);
 }
 new public MyObject this[int index]
 {
 get
  {
  return base[index] as MyObject;
 }
 set
  {
  base[index] = value;
 }
 }
}
這樣就可以簡單的驗證集合的類型了,當然,本質上還是類型不安全的,這只是 一個折衷的辦法。

任何時候,你的類型包含集合時,你可能想要把這些 集合在你的類上暴露給你的用戶。你有兩個方法:使用索引或者使用 IEnumerable接口。記住,在這一原則的一開始,我就說明過,你可以直接使用 []標記來訪問一個數組裡的元素,而且你可以用foreach來迭代數組裡的任何元 素。

你可以為你的類創建多維的索引,以C++裡你可能須要重載[]操作。 而在C#裡,你可以創建多維索引:

public int this [ int x, int y ]
{
 get
 {
  return ComputeValue( x, y );
 }
}

添加對索引器的支持就是說你的類型包含一 個集合。這也就是說你應該支持IEnumerable 接口。IEnumerable 提供了標准的 機制來迭代所有的集合元素:

public interface IEnumerable
{
 IEnumerator GetEnumerator( );
}

GetEnumerator 方法返回一個實現了IEnumerator 接口的對象。 IEnumerator 接口支持集合的歷遍:

public interface IEnumerator
{
 object Current
 { get; }
 bool MoveNext( );
 void Reset( );
}

另外,在使用 IEnumerable 接口時,如果你的類型模型是數組,你應該考慮IList 和 ICollection 接口。如果你的類型模型是字典,你應該考慮實現IDictionary 接 口。你可以自己創建對這些功能強大的接口的實現,而且你可能要花上更多的幾 頁代碼來解釋如何實現。但這裡有一個簡單的解決方案:在你創建自己的特殊集 合類時從CollectionBase 或者DictionaryBase 派生你的類。

讓我們回 顧一下今天的內容,最好的集合取決於你對操作的實現,以及應用程序對空間和 時間的目標要求。在大多數情況下,數組提供了最高效的容器。C#裡擴展的多維 數組,可以簡單的實現多維的結構,而且沒有性能的損失。當我們的應用程序須 要對元素進行更靈活的添加和移動操作時,使用眾多集合中更活越的一個就行了。最後,當你創建自己的集合模型類時,不論什麼時候都實現索引器和 IEnumerable接口。

返回教程目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved