2009-03-04 76 views

回答

8

您可以将索引器视为具有参数的属性。 你用这个参数做什么取决于你。

一般来说,索引器用于提供,以及索引您的对象是有意义的。例如,如果您的对象处理项目集合,可以使用简单的'[]'语法来访问它们是有意义的,因为可以很容易地将它想象为一个数组,我们可以根据这个数组将对象的位置赋予我们想要的位置返回。

前段时间我写了一篇关于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"]; 

这只是表明你可以扭转一个索引的目的,做你想做什么。
并不意味着你应该尽管... :-)

0

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

This article might help explain how custom indexers are made

关于第二点,Enums是整数。如果您需要枚举的字符表示,则仅限于字符串操作,或者您可以使用decorate your enums with appropriate attributes以便它们发出所需的字符串或字符表示形式。

1

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

get访问返回一个值和一组访问分配一个值:

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

随着枚举,它们定义的值被限制为一小部分原始积分类型(字节,为sbyte,短,USHORT的,int,uint,long,ulong)。

char类型也是一种整数类型,但它会从其他整型在两个方面有所不同:

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

  • 字符类型的常量必须写成字符文字或整数文字与转换类型结合使用char。例如,(char)10与'\ x000A'相同。

C# Language Specification 3.0, Section 4.1.5

1

索引器的目的就是,它就像一个数组,但你指定当您从读取和写入索引发生了什么代码。

索引器可以做任何事情来提供像behviour的集合。通常有一些私人收藏可供您使用索引器进行读取或读取/写入访问。

枚举不能使用字符,因为它的基本类型,但可以使用字符文字指定一个整数值:

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

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