public class IndexerClass
{
private string[] name = new string[3];
//索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
public string this[int index]// 这里的index是代表数组name的下标吗???
{
//实现索引器的get方法
get
{
if (index < 3)
{
return name[index];// 这里的name[index]代表的什么???
}
return null;
}
//实现索引器的set方法
set
{
if (index < 3)
{
name[index] = value;
}
}
}
}
public class Test
{
static void Main()
{
//索引器的使用
IndexerClass Indexer = new IndexerClass();
//“=”号右边对索引器赋值,其实就是调用其set方法
Indexer[0] = "张三";
Indexer[1] = "李四";
Indexer[2] = "王五";
//输出索引器的值,其实就是调用其get方法
Console.WriteLine(Indexer[0]);//张三
Console.WriteLine(Indexer[1]);//李四
Console.WriteLine(Indexer[2]);
Console.ReadKey();
}
}
我写了段代码:
这是拿refelctor的逆向结果(对应的c#源码是我手动补上的):
索引器又叫做“索引属性”,也是属性的一种。而属性最终都要编译成普通方法的形式。反映在msil上面就是
callvirt
实例方法调用,set_Item(int32, !0)
和get_Item(int32)
。数组的下标操作应该是msil的特化指令,可以看到上图中有
newarr
、stelem
和ldelem
指令。自己可以拿个reflector看编译后的msil。