1. 程式人生 > 實用技巧 >C# 索引器

C# 索引器

C#索引器(Indexer)

索引器(Indexer)允許一個物件可以像陣列一樣被索引。當您為類定義一個索引器時,該類的行為就會像一個虛擬陣列(virtual array)一樣。您可以使用陣列訪問運算子([ ])來訪問該類的例項。

語法

一維索引器的語法如下:

element-type this[int index]
{
   // get 訪問器
   get
   {
      // 返回 index 指定的值
   }

   // set 訪問器
   set
   {
      // 設定 index 指定的值
   }
}

索引器(Indexer)的用途

索引器的行為的宣告在某種程度上類似於屬性(property)。就像屬性(property),您可使用get

set訪問器來定義索引器。但是,屬性返回或設定一個特定的資料成員,而索引器返回或設定物件例項的一個特定值。換句話說,它把例項資料分為更小的部分,並索引每個部分,獲取或設定每個部分。

定義一個屬性(property)包括提供屬性名稱。索引器定義的時候不帶有名稱,但帶有this關鍵字,它指向物件例項。

class Val
        {
            private string type = "";
            private int parseId;
            public Val()
            {
                type 
= "default"; parseId = 114514; } public string getType() { return type; } //主要是用來維護陣列...吧 public string this[int id]{ set { //模擬解析id... type = $"
title:{value}="; if (id % 2 == 0) { type += "video"; } else { type +="article"; } } get{ //因為這裡沒有維護一個數組,所以這兩個方法並沒有體現出來具體用處 return type; } } public static bool operator !=(Val va, Val vb) { if (va.getType().Equals(vb.getType())) { return false; } return true; } public static bool operator ==(Val va,Val vb) { if (va.getType().Equals(vb.getType())) { return true; } return false; } } public static void run() { Val valA = new Val(); valA[233] = "wtf this article"; Console.WriteLine(valA.getType()); Val valB = new Val(); valB[234] = "wtf this video"; Console.WriteLine(valB.getType()); Console.WriteLine(valA==valB); }

//果然還是寫個正常的索引器使用例子比較好

過載索引器(Indexer)

索引器(Indexer)可被過載。索引器宣告的時候也可帶有多個引數,且每個引數可以是不同的型別。沒有必要讓索引器必須是整型的。C# 允許索引器可以是其他型別,例如,字串型別。

 class Vals
        {
            int[] values;
            string[] names;
            int size;
            public Vals()
            {
                size = 10;
                names = new string[10];
                values = new int[10];
            }
            public string this[int index]
            {
                set
                {
                    if (index < 0 || index > size - 1) { return; }
                    names[index] = value;
                }
                get
                {
                    return names[index];
                }
            }
            public int this[string key]
            {
                get
                {
                    for(int i=0;i<size;i++)
                    {
                        if (key.Equals(names[i]))
                        {
                            return values[i];
                        }
                    }
                    return -1;
                }
                set
                {
                    for (int i = 0; i < size; i++)
                    {
                        if (key.Equals(names[i]))
                        {
                            values[i]= value;
                        }
                    }
                }
            }
        }
        public static void run()
        {
            Val valA = new Val();
            valA[233] = "wtf this article";
            Console.WriteLine(valA.getType());
            Val valB = new Val();
            valB[234] = "wtf this video";
            Console.WriteLine(valB.getType());
            Console.WriteLine(valA==valB);
            Vals vals = new Vals();
            vals[0]= "anyname";
            vals["anyname"]= 114514;
            vals[1] = "testname";
            vals["testname"] = 36942;
            Console.WriteLine(vals["anyname"]);
            Console.WriteLine(vals["noname"]);
        }