Indexers有什么用?

时间:2009-03-04 07:41:36

标签: c#

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

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

5 个答案:

答案 0 :(得分:8)

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

通常,索引器用于向对象提供索引的情况。

例如,如果您的对象处理项目集合,则能够使用简单的'[]'语法访问它们是有意义的,因为很容易将其视为我们给出对象位置的数组我们想回来。

前段时间我在indexers using 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"];

这只是为了表明你可以扭曲索引器的目的来做你想做的事 并不意味着你应该......: - )

答案 1 :(得分:1)

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

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# Language Specification 3.0, Section 4.1.5

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

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

article might help explain how custom indexers are made

关于你的第二点,Enums是整数。如果你需要枚举的字符表示,你只能使用字符串操作,或者你可以decorate your enums with appropriate attributes使它们发出你想要的字符串或字符表示。

答案 4 :(得分:0)

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