C#中索引器的真正用途是什么?
因为我是一名新的c#程序员,所以看起来很混乱。它看起来像一个对象数组,但事实并非如此。
答案 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'相同。
答案 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