System.Array用作公共语言运行时 (CLR) 中所有数组的基类。根据这篇文章:
对于每个具体的数组类型,[the] 运行时添加三个特殊方法:
Get
//Set
。Address
事实上,如果我反汇编这段 C# 代码,
int[,] x = new int[1024,1024];
x[0,0] = 1;
x[1,1] = 2;
x[2,2] = 3;
Console.WriteLine(x[0,0]);
Console.WriteLine(x[1,1]);
Console.WriteLine(x[2,2]);
进入 CIL 我得到,
IL_0000: ldc.i4 0x400
IL_0005: ldc.i4 0x400
IL_000a: newobj instance void int32[0...,0...]::.ctor(int32,
int32)
IL_000f: stloc.0
IL_0010: ldloc.0
IL_0011: ldc.i4.0
IL_0012: ldc.i4.0
IL_0013: ldc.i4.1
IL_0014: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_0019: ldloc.0
IL_001a: ldc.i4.1
IL_001b: ldc.i4.1
IL_001c: ldc.i4.2
IL_001d: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_0022: ldloc.0
IL_0023: ldc.i4.2
IL_0024: ldc.i4.2
IL_0025: ldc.i4.3
IL_0026: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_002b: ldloc.0
IL_002c: ldc.i4.0
IL_002d: ldc.i4.0
IL_002e: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_0033: call void [mscorlib]System.Console::WriteLine(int32)
IL_0038: ldloc.0
IL_0039: ldc.i4.1
IL_003a: ldc.i4.1
IL_003b: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_0040: call void [mscorlib]System.Console::WriteLine(int32)
IL_0045: ldloc.0
IL_0046: ldc.i4.2
IL_0047: ldc.i4.2
IL_0048: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_004d: call void [mscorlib]System.Console::WriteLine(int32)
可以清楚地看到对上述Get
和方法的调用。Set
这些方法的数量似乎与数组的维数有关,这大概就是为什么它们是由运行时创建而不是预先声明的。我在 MSDN 上找不到有关这些方法的任何信息,它们的简单名称使它们无法使用 Google 搜索。我正在为支持多维数组的语言编写编译器,所以我想找到一些关于这些方法的官方文档,在什么条件下我可以期望它们存在以及我可以期望它们的签名是什么。
特别是,我想知道是否有可能获得一个MethodInfo
对象以Get
供Set
使用,Reflection.Emit
而不必创建一个具有正确类型和维度的数组实例来反映,就像在链接示例中所做的那样。