Indexers有什么用?

C#中索引器的真正用途是什么?

它看起来很混乱,因为我是一名新的c#程序员。 它看起来像一个对象数组,但事实并非如此。

您可以将索引器视为带参数的Property。 您对此参数的处理取决于您自己。

通常,索引器用于提供对象的索引是有意义的。

例如,如果你的对象处理项目集合,能够使用简单的'[]'语法访问它们是有道理的,因为很容易将它想象为一个数组,我们给出了要返回的对象的位置。

我不久前写了一篇关于使用reflection的索引器方面的博客文章。
我给出的一个例子是:

  using System; using System.Collections; public class DayPlanner { // We store our indexer values in here Hashtable _meetings = new System.Collections.Hashtable(); // First indexer public string this[DateTime date] { get { return _meetings[date] as string; } set { _meetings[date] = value; } } // Second indexer, overloads the first public string this[string datestr] { get { return this[DateTime.Parse(datestr)] as string; } set { this[DateTime.Parse(datestr)] = value; } } } 

然后你可以像这样使用它:

  DayPlanner myDay = new DayPlanner(); myDay[DateTime.Parse("2006/02/03")] = "Lunch"; ... string whatNow = myDay["2006/06/26"]; 

这只是为了表明你可以扭曲索引器的目的来做你想要的。
并不意味着你应该…… 🙂

索引器允许类或结构的实例像数组一样被索引,它们最常用于主要用于封装内部集合或数组的类型。

get访问器返回一个值,set访问器分配一个值:

 public T this[int i] { get { return arr[i]; } set { arr[i] = value; } } 

对于枚举,它们定义的值仅限于一小组原始整数类型(byte,sbyte,short,ushort,int,uint,long,ulong)。

char类型也是一个整数类型,但它在两个方面与其他整数类型不同:

  • 其他类型没有隐式转换为char类型。 特别是,即使sbyte,byte和ushort类型具有使用char类型可完全表示的值范围,也不存在从sbyte,byte或ushort到char的隐式转换。

  • char类型的常量必须写为字符文字或整数文字,并与强制转换为char类型。 例如,(char)10与’\ x000A’相同。

( C#语言规范3.0,第4.1.5节 )

索引器的目的只是它像数组一样工作,但是当您读取和写入索引器时,您可以指定代码。

索引器可以做很多事情来提供像behviour这样的集合。 通常会有某种私有集合,您可以使用索引器提供读取或读取/写入访问权限。

枚举不能使用char作为基类型,但您可以使用字符文字来指定整数值:

 public enum Characters : int { Alpha = 'a', Beta = 'b' } 

Characters.Alpha的值为97,Characters.Alpha.ToString()将返回字符串“Alpha”。 (char)Characters.Alpha给出值’a’。

.NET中的任何集合,无论是ArrayLists还是generics列表,都在其底层结构中具有幕后数组。 索引器只是一种改变常规数组索引工作方式的方法,无论是通过接受字符串作为输入来查找具有该属性的相应对象,还是其他一些输入。 但是,同样,在所有语法糖的下面,它仍然以数组的表示结束。

本文可能有助于解释如何制作自定义索引器 。

在你的第二点,Enums是整数。 如果您需要枚举的字符表示,则仅限于字符串操作,或者您可以使用适当的属性修饰您的枚举,以便它们将发出您想要的字符串或字符表示。

关于枚举,如果您需要特定的枚举,请考虑使用类型安全枚举模式,请参阅链接: http : //www.javacamp.org/designPattern/enum.html