索引器的作用是什么?

7

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

对于一个新的C#程序员来说,看起来相当困惑。它看起来像一个对象数组,但实际上并不是。

5个回答

9
您可以将索引器视为带有参数的属性。您对此参数所做的操作取决于您自己。
通常情况下,索引器用于在提供对象“索引”的情况下使用。
例如,如果您的对象处理项目集合,则能够使用简单的“[]”语法访问它们是有意义的,因为可以将其想象为一个数组,我们给出要返回的对象的位置。
我之前写过一篇关于使用反射的索引器的博客文章,其中之一是:
 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
索引器允许类或结构的实例像数组一样被索引,它们最常用于主要目的是封装内部集合或数组的类型中。
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 节)


1
索引器的目的就是像数组一样工作,但你可以指定读取和写入索引器时发生的代码。
索引器可以做任何事情来提供类似集合的行为。通常有一种私有集合,您可以使用索引器提供读取或读/写访问权限。
枚举不能使用 char 作为其基本类型,但您可以使用字符字面值来指定整数值:
public enum Characters : int {
    Alpha = 'a',
    Beta = 'b'
}

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


0

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

这篇文章可能会帮助解释如何制作自定义索引器

关于您的第二个观点,枚举是整数。如果您需要枚举的字符表示形式,则仅限于字符串操作,或者您可以使用适当的属性装饰您的枚举,以便它们将发出所需的字符串或字符表示形式。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接