C#索引器

索引器允許對象被索引,例如:數組。 當爲類定義索引器時,此類與虛擬數組類似。可以使用數組訪問運算符([])訪問此類的實例。

語法

一維索引器的語法如下:

element-type this[int index]
{
   // The get accessor.
   get
   {
      // return the value specified by index
   }

   // The set accessor.
   set
   {
      // set the value specified by index
   }
}

索引器的使用

索引器的行爲聲明在某種程度上與屬性相似。與屬性類似,可以使用getset訪問器定義索引器。但是,屬性返回或設置特定的數據成員,而索引器從對象實例返回或設置特定值。 換句話說,它將實例數據分解成較小的部分,並對每個部分進行索引,獲取或設置每個部分。

定義屬性涉及提供屬性名稱。索引器不是用名稱定義的,而是使用這個引用對象實例的關鍵字。以下示例演示了以下概念:

using System;
namespace IndexerApplication
{
    class IndexedNames
    {
        private string[] namelist = new string[size];
        static public int size = 10;
        public IndexedNames()
        {
            for (int i = 0; i < size; i++)
                namelist[i] = "N. A.";
        }

        public string this[int index]
        {
            get
            {
                string tmp;

                if (index >= 0 && index <= size - 1)
                {
                    tmp = namelist[index];
                }
                else
                {
                    tmp = "";
                }

                return (tmp);
            }
            set
            {
                if (index >= 0 && index <= size - 1)
                {
                    namelist[index] = value;
                }
            }
        }

        static void Main(string[] args)
        {
            IndexedNames names = new IndexedNames();
            names[0] = "Maxsu";
            names[1] = "Sukida";
            names[2] = "Mark";
            names[3] = "Jame";
            names[4] = "Davinder";
            names[5] = "Lucy";
            names[6] = "Lily";
            for (int i = 0; i < IndexedNames.size; i++)
            {
                Console.WriteLine(names[i]);
            }

            Console.ReadKey();
        }
    }
}

當上述代碼被編譯並執行時,它產生以下結果:

Maxsu
Sukida
Mark
Jame
Davinder
Lucy
Lily
N. A.
N. A.
N. A.

重載索引器

索引器可以重載。索引器也可以聲明爲多個參數,每個參數可能是不同的類型。 索引不一定是整數。 C# 允許索引爲其他類型,例如:字符串。

以下示例演示了重載的索引器:

using System;
namespace IndexerApplication
{
    class IndexedNames
    {
        private string[] namelist = new string[size];
        static public int size = 10;
        public IndexedNames()
        {
            for (int i = 0; i < size; i++)
            {
                namelist[i] = "N. A.";
            }
        }

        public string this[int index]
        {
            get
            {
                string tmp;

                if (index >= 0 && index <= size - 1)
                {
                    tmp = namelist[index];
                }
                else
                {
                    tmp = "";
                }

                return (tmp);
            }
            set
            {
                if (index >= 0 && index <= size - 1)
                {
                    namelist[index] = value;
                }
            }
        }
        public int this[string name]
        {
            get
            {
                int index = 0;
                while (index < size)
                {
                    if (namelist[index] == name)
                    {
                        return index;
                    }
                    index++;
                }
                return index;
            }

        }

        static void Main(string[] args)
        {
            IndexedNames names = new IndexedNames();
            names[0] = "Maxsu";
            names[1] = "Richer";
            names[2] = "Nuber";
            names[3] = "DockJ";
            names[4] = "Vadder";
            names[5] = "Sukida";
            names[6] = "Ruby";

            //using the first indexer with int parameter
            for (int i = 0; i < IndexedNames.size; i++)
            {
                Console.WriteLine(names[i]);
            }

            //using the second indexer with the string parameter
            Console.WriteLine(names["Nuha"]);
            Console.ReadKey();
        }
    }
}

當上述代碼被編譯並執行時,它產生以下結果:

Maxsu
Richer
Nuber
DockJ
Vadder
Sukida
Ruby
N. A.
N. A.
N. A.
10