索引器

来源:互联网 发布:数据科学家累吗 编辑:程序博客网 时间:2024/04/26 01:35

C#中的索引器通常用于索引数组,楼上的THIS就是索引器了。

索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了

索引器和返回值无关

 

简单的讲:

public class Things //需要加索引的类

{

private int[] i = new i[100]; //定义一个数组

public int this[int a] //声明索引器

{

get

{

return i[a];

}

set

{

i[a]=value;

}

}

}

调用:

static void Main(string[] args){

Things thing=new Things();

thing[0]=100;

System.Console.Write(s[0]);

}

会输出 100

 

 

 

 

 

这是一个例子

class Indexer : IEnumerable
{
int[] a = new int[5];
string[] s = new string[] { "1st", "2nd", "3rd", "4th", "5th" };

public int this[string i] //
字符串作索引
{
get
{
return a[Array.FindIndex(s, k => k == i)];
}
set
{
a[Array.FindIndex(s, k => k == i)] = value;
}
}

public IEnumerator GetEnumerator()
{
return a.GetEnumerator();
}

}

class Test {

static void Main()
{
Indexer i = new Indexer();
i["1st"] = 3;
i["2nd"] = 4;
i["3rd"] = 5;
i["4th"] = 1;
i["5th"] = 100;
foreach (int k in i)
Console.Write(k + " ");
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#语言一个最令人感兴趣的地方就是类的索引器(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访问函数,这样任何设置属性的尝试都会产生编译错误。

  采用索引器的益处

  下面是它的结构

  
<modifier> <return type> this [argument list]
  
...{
  
get
  
...{
  
// Get codes goes here
  
}
  
set
  
...{
  
// Set codes goes here
  
}
  
}
  注:

  modifier:修饰词,如
private, public, protected or internal
  this:在C#this是一个特殊的关键字,它表示引用类的当前实例。在这里它的意思是当前类的索引。

  argument list:这里指索引器的参数。

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

  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的索引器具体定义getset访问函数。

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

  class SampleCollection<T>
  
{
  
private T[] arr = new T[100];
  
public T this[int i]
  
{
  
get
  
{
  
return arr[i];
  
}
  
set
  
{
  
arr[i] = value;
  
}
  
}
  
}
  
// This class shows how client code uses the indexer
  
class Program
  
{
  
static void Main(string[] args)
  
{
  
SampleCollection<string> stringCollection = new SampleCollection<string>();
  
stringCollection[0] = "Hello, World";
  
System.Console.WriteLine(stringCollection[0]);
  
}
  }