c# 索引器简介与使用


一、索引器简介

索引器是接口中的一个特殊成员,我们可以在接口中定义一个索引器,来达到约束类的行为。
索引器是类中的一个特殊成员
当类中存在数组或集合时,使用索引器可以很方便的对数组和集合进行访问和修改操作。
索引器类似于属性可以定义get set操作,但与属性不同在于索引器访问需要输入参数


二、索引器应用

索引器语法:
public class 类{

public 返回值类型 this[索引值类型 索引值]{
get {return 根据索引值 返回相应的值} //get访问器
set {根据索引值 设置相应的值} //set访问器
}

}

2.1 索引器应用一

//定义一个类 包含一个数组对象 申明一个索引器 可以对数组进行赋值和取值操作
public class test{
    private string[] testInfo = new string[20]; //在类中初始化一个数组
    
    //申明一个索引器
    public string this[int location]
    {
       get {if(location <20){return name[location];} return null;}
       set {if(location<20){ name[location] =value;}}
    }
}


public class program
{
   static void Main(){

      test t = new test();  //申明一个类
      t[0] =@“http://www.maomao365.com”; //索引器赋值 
      t[1] =@“猫猫小屋”;

      Console.WriteLine(t[0]); //索引器取值
      Console.WriteLine(t[1]); 
      Console.ReadKey();//按任意键退出当前操作
    }

}



索引器采用其它类型索引器

 public class test{
   private Hashtable t = new Hashtable();
  
   public string this[string location]
    {
      get{return t[location].ToString();}
      set{t.Add(location,value);}
    }
  }

 public class m
 {
   static void Main(){
     test t = new test();
     t[“value1”] =“value1”;
     t[“value2”] =“value2”;
     //输出
    Console.WriteLine(t[“value1”]);
    Console.WriteLine(t[“value2”]);
   }
 }


 

索引器重载

 
    class test
    {
       

        private string[] strings;
        private int count=0;

        public test(params string[] initStr)   //params 可以采用 {“”,””,””…} 输入格式
        {
            strings = new string[256];
            foreach (string tmp in initStr)
            {
                strings[count++] = tmp;
            }
        }

        public void Add(string str)
        {
            if (count > strings.Length)
            {
                Console.WriteLine(“数组尺寸大”);
            }
            else 
                strings[count++]=str;
        }

        //索引器定义
        public string this[int location]
        {
            get 
            {
                if (location < 0 || location > strings.Length)
                {
                    Console.WriteLine(“参数超过最大索引值”);
                    return “异常信息”;
                }
                else
                    return strings[location];
            }
            set 
            {
                if (location < 0 || location > strings.Length)
                    Console.WriteLine(“超过最大尺寸”);
                else
                    strings[location] = value;
            }
        }

        private int searchString(string str)
        {
            for (int i = 0; i < strings.Length; i++)
                if (strings[i].StartsWith(str))
                    return i;
            return -1;
        }

        //索引器重载(输入参数不同,产生不同的索引器)
        public string this[string location]
        {
            get
            {
                if (location.Length == 0)
                {
                    Console.WriteLine(“索引参数输入错误!”);
                }
                return this[searchString(location)];
            }
            set
            {
                strings[searchString(location)]=value;
            }
        }


        public int getQtyAll{ get{return count;} }
 
    }

    public class Tester
    {
        static void Main()
        {
            test t=new test(“a”,”b”,”c”,”d”);
            t.Add(“e”);
            t.Add(“f”);
            t.Add(“g”);
            t.Add(“h”);

            t[3] = “testInfo”;  
            t[“b”]=“调用重载索引器1”;
            t[“c”]=“调用重载索引器2”;
            for (int i = 0; i < t.getQtyAll; i++)
              {
                 Console.WriteLine(“参数信息[{0}]={1}”, i, t[i]);
              }
        }
    }
}

多参索引器

public class 类{

public 返回值类型 this[索引值类型 索引值1,索引值类型 索引值2]{
get {return 根据索引值1 索引值2 进行相关的判断 返回相应的值} //get访问器
set {根据索引值1 索引值2 设置相应的值} //set访问器
}

}



索引器和数组区别:

索引器隶属于类成员,不是一个变量,而数组就是一个数据变量;
索引器中的索引值类型,可以为任意类型,然后在获取和设置值时,进行相应的判断操作;
索引器重载:一个类中,可以通过不同的返回格式,产生多个索引器,这就是索引器重载。


索引器和属性区别:

索引器可以重载,而且需要输入参数(可以输入多个参数),索引器不能申明为static,而属性可以。