C#索引器的优点是什么?

时间:2010-01-06 22:32:32

标签: c# methods indexer

进行一些代码阅读并偶然发现了我之前从未见过的代码片段:

public SomeClass {
  public someInterface this[String strParameter] {
    get {
      return SomeInternalMethod(strParameter);
    }
  }
}

看起来如下所示:

SomeClass _someClass = new SomeClass();
SomeInterface returnedValue = _someClass["someString"];

我对这个函数适合的位置或者用这种风格写作的意图感兴趣。例如,为什么这比仅仅调用函数更受欢迎?

11 个答案:

答案 0 :(得分:21)

参见语言规范,第10.9节,其中规定:

Indexer是一个成员,它允许以与数组相同的方式对对象建立索引。

索引器和属性在概念上非常相似,但在以下方面有所不同:

  • 属性由其名称标识,而索引器由其签名标识。
  • 通过简单名称(第7.5.2节)或成员访问(第7.5.4节)访问属性,而通过元素访问(第7.5.6.2节)访问索引器元素。 LI>
  • 属性可以是静态成员,而索引器始终是实例成员。
  • 属性的get访问器对应于没有参数的方法,而索引器的get访问器对应于与索引器具有相同形式参数列表的方法。
  • 属性的set访问器对应于具有名为value的单个参数的方法,而索引器的set访问器对应于具有与索引器相同的形式参数列表的方法,以及名为value的附加参数。
  • 索引器访问器声明一个与索引器参数同名的局部变量是编译时错误。
  • 在重写属性声明中,使用语法base.P访问继承的属性,其中P是属性名称。在重写索引器声明中,使用语法base [E]访问继承的索引器,其中E是以逗号分隔的表达式列表。

答案 1 :(得分:17)

似乎很多答案都集中在索引器上,而不是为什么要使用索引器。

就我而言,这是使用索引器的动机:

您正在开发一个 某种类型的集合的类,但您希望该类对用户(该类的使用者)显示为 一个集合。

我能想到的最好的例子是ADO.NET中的DataRow类。如果您想获得DataRow的第五个单元格的值,可以使用DataRow.Item[4]DataRow[4]。后一种形式是一种方便和逻辑的快捷方式,它很好地展示了为什么你想要使用索引器。对于用户来说,DataRow可以被认为只是一组单元格(即使它真的不止于此),因此能够直接获取和设置单元格值而不必记住是有意义的您实际上正在获取/设置Item

希望有所帮助。

答案 2 :(得分:6)

在许多情况下,'index'语法很有意义。如果SomeClass表示某种集合,它特别有用。

答案 3 :(得分:3)

它允许你进行关联数组查找(a.k.a。“字典样式”),正如你在问题中提到的那样。

这就是重点。有些人喜欢这样,特别是来自内置语言的人,比如Python或PHP

答案 4 :(得分:3)

“this”关键字是索引器

来自http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

“索引器允许类或结构的实例像数组一样被索引。索引器类似于属性,除了它们的访问器接受参数。”

答案 5 :(得分:1)

您之前可能已经偶然发现了类似的事情:

var myList = new List<string>();
myList.Add("One");
myList.Add("Two");
myList.Add("Three");

for(int i = 0; i < myList.Count; i++) {
    string s = myList[i];
}

索引器是实现集合的对象的“主键”。它只是编写像.GetValue(索引)这样的函数的简写方法 - 如果你愿意的话,可以用语法糖。但它也使意图明确。

答案 6 :(得分:0)

它是索引运算符[ ]的实现。

答案 7 :(得分:0)

这是一个操作员超载。如果你正在编写一个集合类,例如在使用数组表示法访问它时有用,例如,集合[someIndex]。

你当然可以编写一个collection.GetElement(someIndex)函数,但它是一个样式/可读性的东西。

答案 8 :(得分:0)

您可以在键值对类中使用此方法。

我不确定c#中的类似类是什么,但在c ++ STL中,有一个map类,你用SomeObject["key"]调用方法,它将返回与该键相关的“值”。

答案 9 :(得分:0)

这称为索引器,它们允许您使用List&lt;&gt ;,ArrayList,Dictionary&lt;&gt;以及使用数组语法的所有其他集合。

这只是语法糖,但在正确使用时它提供了一些可读性。

答案 10 :(得分:0)

在我看来,它只是一种语法方便。 你会在哪里使用它:

public SomeClass {
  private int[] nums;
  public GetVal this[int ind] {
    get {
      return nums[ind]; // this is pointless since array is already indexed
    }
  }
}

你从哪里受益

public Matrix {
  private Dictionary<string, double> matrixData; // Matrix indecies, value
  public double this[int row, int col] {
    get {
      return matrixData[string.Format("{0},{1}", row, col)];
    }
  }
}

正如您所看到的,由于某种原因,您的数据是一个使用字符串键索引的字典,并且您希望使用两个整数不同来调用它,但仍然不想更改您的数据类型:

Matrix m = new Matrix();
...
Console.WriteLine( m[1,2] );