我在哪里可以找到获取,设置和地址方法在.NET多维的System.Array实例的信息?
-
23-09-2019 - |
题
的System.Array 用作基类在公共语言运行时(CLR)的所有阵列。根据本文一个>:
有关每个具体数组类型,[该]运行时增加了三种特殊的方法:
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和他们简单的名称的任何信息,使他们能够抵抗谷歌搜索。我正在写支持多维数组一个语言的编译器,所以我想找到有关这些方法,在什么情况下我能指望他们有什么我可以期待他们的签名是一些官方文件。
在特别地,我想知道是否其可能获得对MethodInfo
或Get
用于与Set
使用Reflection.Emit
对象,而无需创建实例与正确的类型和维度在阵列的这反映,如在链接的示例来完成。
解决方案
看这里,具体上63-65页部分14.2
但外卖,你可以从IL告诉,是他们的getter和setter方法在给定的索引位置与数组处理。
•一个Get方法,它利用一个序列 INT32参数,每一个 返回所述阵列的尺寸,并且一个 值,其类型是元素类型 阵列的。此方法用于 访问阵列的特定元素 其中参数指定索引 到每个层面,开始用 所述第一元件的,要 返回。
•一组方法,它的序列 的INT32参数,每一个 该阵列的尺寸,接着进行 值,其类型是元素类型 阵列的。集的返回类型 是无效的。这种方法用于设置一 的阵列,其中的特定元件 该参数指定的索引 每个维度,与开始 首先,元件的要被设置和 最后一个参数指定的值 要被存储到目标元件。
•,需要一个一个地址方法 的INT32参数序列,一个用于 所述阵列的每一维,且具有 返回类型是托管指针 到阵列的元件的类型。这个 方法用来返回一个管理 指针的特定元素 阵列,其中所述参数指定 索引到每个维度,开始 与第一其元素的, 地址是要被返回。
编辑:,使用文档的页码的页63-65。 73-75在实际的PDF。
其他提示
要回答你的第二个问题,你并不需要创建一个实例来获得这些方法的MethodInfo
。类似
var mi = typeof(string).MakeArrayType(6).GetMethod("Get");
将努力得到该Get
类型string[,,,,,]
方法。
我不知道这是否会满足您的非常具体的问题,但关于这个问题有很大文本(等等)是的 “相对=” nofollow noreferrer“> CLR。它会非常深入了很多的你感兴趣的话题,并且花费了大量的时间与反汇编看着许多基地.NET类型包括数组的内部运作。绝对值得检查。