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
       }
    }
    
    
  • 索引器的使用

    索引器行为的声明在某种程度上类似于属性。与属性类似,您可以使用get和set访问器来定义索引器。但是,属性返回或设置特定的数据成员,而索引器从对象实例返回或设置特定的值。换句话说,它将实例数据分解为较小的部分并为每个部分建立索引,获取或设置每个部分。定义属性涉及提供属性名称。索引器不是用名称定义的,而是使用this关键字定义的,该关键字引用对象实例。以下示例演示了概念-
    
    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] = "Zara";
             names[1] = "Riz";
             names[2] = "Nuha";
             names[3] = "Asif";
             names[4] = "Davinder";
             names[5] = "Sunil";
             names[6] = "Rubic";
             
             for ( int i = 0; i < IndexedNames.size; i++ ) {
                Console.WriteLine(names[i]);
             }
             Console.ReadKey();
          }
       }
    }
    
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Zara
    Riz
    Nuha
    Asif
    Davinder
    Sunil
    Rubic
    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] = "Zara";
             names[1] = "Riz";
             names[2] = "Nuha";
             names[3] = "Asif";
             names[4] = "Davinder";
             names[5] = "Sunil";
             names[6] = "Rubic";
             
             //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();
          }
       }
    }
    
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Zara
    Riz
    Nuha
    Asif
    Davinder
    Sunil
    Rubic
    N. A.
    N. A.
    N. A.
    2