快速了解c#中的索引器

 C#中的索引器是新增加的,和属性有些不同。在c#中,属性可以是这样的:

class Person {
private string firstname;
public string FirstName
 {
get {return firstname;}

set {firstname = value;}
}

}

属性声明可以如下编码:
Person p = new Person();
p.FirstName = "TOM";
Console.WriteLine (p.FirstName);

属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。
   索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用。索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。下面是个例子:
  

using System;


namespace IndexerExample
{

Class MyPreviousExp
{
 private string[] myCompanies = new string[10];

 //index creation
 public string this[int index]
 {
 
  get
  {
   if(index <0 or index >= 6)
    return "null";
   else
    return myCompanies[index];
   
  }
  set
  {
   if(!(index <0 or index >= 10))
    myCompanies[index] = value;
  }
 
 }
}
Class myMainClass
{
 public static void Main()
 {
  myPreviousExp indexerObj = new myPreviousExp();
 
  indexerObj[0] = "AMS"
  indexerObj[3] = "HCL"
  indexerObj[5] = "ACC"
  for(int i=0; i<10; i++
  {   
  
   Console.WriteLine(" My Companies{0} : {1} ",i,indexerObj[i]);
  }
  
 }
}

}
  可见,我们象通过数组那样,访问到了其中的元素,而通过
myPreviousExp indexerObj = new myPreviousExp();
  建立了索引器,再通过
  indexerObj[0] = "AMS"
  indexerObj[3] = "HCL"
  indexerObj[5] = "ACC"
设置值
最后输出为:
 

myCompanies 0 : AMS
myCompanies 1 :
myCompanies 2 :
myCompanies 3 : HCL
myCompanies 4 :
myCompanies 5 : ACC
myCompanies 6 : null
myCompanies 7 : null
myCompanies 8 : null
myCompanies 9 : null

相关说明:

C#语言一个最令人感兴趣的地方就是类的索引器(indexer)。简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。本文就会引领你设置类来采用索引器。但是,首先让我们概述下属性这个概念以便了解些必要的背景知识。   

属性  

假如你曾经用vb6编写过程序,那么你应该很熟悉属性方法才对,所谓属性方法其实就是特殊的类成员,它实现了对私有类域的受控访问。在c#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,其间创建了一个 firstname属性,由它控制对私有类成员firstname的访问

class person {

private string firstname; public string firstname

{ get {return firstname;}

set {firstname = value;}

}

}

属性声明可以如下编码

person p = new person();

p.firstname = "lamont"; console.writeline (p.firstname);

  如你你所看到的那样,属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。你可以创建只读属性,方法是省略set访问函数,这样任何设置属性的尝试都会产生编译错误。  

采用索引器的益处  

说了半天咱们转到正题上来,那么为什么我要兜这个圈子呢?其实,这是因为类的索引器非常像属性,从代码上看也是这样。以下是具有索引器的类示例,通过索引器会返回一个字符串

class sample {

public string this [int index]

{ get {return "you passed " + index;

}

}

}   

注意,这里的属性名是this,意思是回引类的当前实例,参数列表包含在方括号而非括号之内。还有,这是一个只读索引器。为了把它改成读/写类型,我又添加了一个set访问函数。在定义索引器的时候,你不一定只采用一个参数。索引器参数可以采用任何类型,不过int是通常采用也是最为合理的类型。同一类中还可能拥有一个以上的索引器(重载)。   如上定义了sample类之后,我们就可以把索引器用作某种默认的属性,如下所示

sample s = new sample(); console.writeline(s[55]);   

属性和索引器   

属性和索引器之间有好些差别

类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。   

属性可以是static(静态的)而索引器则必须是实例成员。  

为索引器定义的访问函数可以访问传递给索引器的参数,而属性访问函数则没有参数。   

接口  

类似数组的行为常受到程序实现者的喜爱,所以你还可以为接口定义索引器,ilist和 idictionary集合接口都声明了索引器以便访问其存储的项目。  

在为接口声明索引器的时候,记住声明只是表示索引器的存在。你只需要提供恰当的访问函数即可,不必包括范围修饰符。以下代码把索引器声明为接口 iimplementme的一部分 interface iimplementme { string this[int index] { get; set; }   

相应实现的类则必须为iimplementme的索引器具体定义get和set访问函数。  

以上就是有关索引器的一些基本概述了。现在你应该对索引器在你的开发中所具有的作用有了较深入的了解。

posted on 2011-08-31 23:01  Jimmy.x.zhou  阅读(215)  评论(0编辑  收藏  举报

导航