C#索引也称作带参数的属性;
其语法为相当于重载[],如public bool this[int pos]{};
当我们定义了一个这样一个索引的时候,其实编译器在后台帮我们做了很多事情(拿上面这个做例子,其实类似于属性):
生成下面两个函数:
public Boolean get_Item(Int32 pos) { return true; }
public void set_Item(Int32 bitPos, Boolean value) {}
如果你懒得从IL去看生成的源代码,有个办法可以核实,就是你在你的类里面定义这两个函数,当编译器想生成默认的时候,就会有编译错误:如下
Error 2 Type already reserves a member called 'set_Item' with the same parameter
这个和属性里面是一样的原理,属性也会帮你生成一个get 和set函数,如下:
public string Name {get;set; }
public string get_Name()
{
return "";
}
这也会导致编译器抛出同样的错误;
当然如果你想改变编译器默认生成的函数名字,该怎么办,微软为我们提供了一个特性IndexerName,利用它我们就可以生成特定的名字了:
[IndexerName("Good")]
public Boolean this[Int32 pos] {}
这样就可以编译通过了(这时候默认的就是get_Good,set_Good);
需要注意得是:我们可以创建带多个参数的索引,还能重载如:
public bool this[int i,int test]
{
get
{
return true;
}
set
{
}
}
public bool this[int i]
{
get
{
return true;
}
set
{
}
}