星期二, 8月 22, 2006

C# Indexers Property

今天在看HashTable的help發現一個很有趣的東西,也就是Indexers! Indexers應是C#的一種概念很像是一個array,雖然之前常常使用,但是卻沒有很認真看待他!

其實只要你在宣告時,使用了保留字"this"都是使用到了此一機制,不論是property,interface,struct都是!他雖然與array很相似,但是本質卻不相同
1.Indexers與function相同,提供多載overloaded
2.Indexers可以使用非數值型態的標示
3.Indexers不可以使用ref或是out方式來當參數的傳遞

下面是一個簡單的例子
public class BearTest
{
 private string[] Data;
 private int Size;
 public BearTest(int Asize)
 {
  this.Size = Asize;
  Data = new string[this.Size];
  for (int i = 0; i < Data.Length; i++)
  {
   Data[i] = string.Empty;
  }
 }

 public string this[int Apos]
 {
  get
  {
   if (Apos >= this.Size)
    throw new ArgumentOutOfRangeException("太大了");
   return Data[Apos];
  }
  set
  {
   if (Apos >= this.Size)
    throw new ArgumentOutOfRangeException("太大了");
   Data[Apos] = value;
  }
 }
}

呼叫
BearTest b = new BearTest(10);
b[0] = "100";
MessageBox.Show(b[0].ToString());

在collection中其實有很多這樣子的例子,不過他有經過了延伸,像是hashtable的key與value即是,以往平常熊都是這樣子用hashtable的

Hashtable hb = new Hashtable();
hb.Add("Bear", "熊");

而今天發現其實可以簡化成
hb["Bear"] = "熊";

前者在add二次Bear時會失敗,但是後者會用不會,會用第二次代換掉第一次的value值,這樣子的寫法也有缺點啦,失去了不可重覆key值的檢查,所以看你程式想要達成什麼功能了。

0 個意見: