C#索引器(Indexer)

索引器(英文名:Indexer)是类中的一个特殊成员,它能够让对象以类似数组的形式来操作,使程序看起来更为直观,更容易编写。索引器与属性类似,在定义索引器时同样会用到 get 和 set 访问器,不同的是,访问属性不需要提供参数而访问索引器则需要提供相应的参数。

定义索引器

C# 中属性的定义需要提供属性名称,而索引器则不需要具体名称,而是使用 this 关键字来定义,语法格式如下:

索引器类型 this[int index]
{
    // get 访问器
    get
    {   
        // 返回 index 指定的值
    }

    // set 访问器
    set
    {
        // 设置 index 指定的值
    }
}

【示例】下面通过一个完整的示例来演示索引器的使用:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            Demo names = new Demo();
            names[0] = "C语言中文网";
            names[1] = "http://c.biancheng.net/";
            names[2] = "C#教程";
            names[3] = "索引器";
            for ( int i = 0; i < Demo.size; i++ ){
                Console.WriteLine(names[i]);
            }
            Console.ReadKey();
        }

        static public int size = 10;
        private string[] namelist = new string[size];
        public Demo(){
            for (int i = 0; i < size; i++)
                namelist[i] = "NULL";
        }
        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;
                }
            }
        }
    }
}
运行结果如下:

C语言中文网
http://c.biancheng.net/
C#教程
索引器
NULL
NULL
NULL
NULL
NULL
NULL

索引器重载

索引器可以被重载,而且在声明索引器时也可以带有多个参数,每个参数可以是不同的类型。另外,索引器中的索引不必是整数,也可以是其他类型,例如字符串类型。

【示例】下面通过示例来演示索引器重载。
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            Demo names = new Demo();
            names[0] = "C语言中文网";
            names[1] = "http://c.biancheng.net/";
            names[2] = "C#教程";
            names[3] = "索引器";
            // 使用带有 int 参数的第一个索引器
            for (int i = 0; i < Demo.size; i++){
                Console.WriteLine(names[i]);
            }
            // 使用带有 string 参数的第二个索引器
            Console.WriteLine("“C#教程”的索引为:{0}",names["C#教程"]);
            Console.ReadKey();
        }

        static public int size = 10;
        private string[] namelist = new string[size];
        public Demo(){
            for (int i = 0; i < size; i++)
                namelist[i] = "NULL";
        }
        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;
            }
        }
    }
}
运行结果如下:

C语言中文网
http://c.biancheng.net/
C#教程
索引器
NULL
NULL
NULL
NULL
NULL
NULL
“C#教程”的索引为:2