System.Array służy jako klasa podstawowa dla wszystkich tablic w Common Language Runtime (CLR). Według this article:Gdzie mogę znaleźć informacje na temat metod Get, Set i Address dla wielowymiarowych instancji System.Array w .NET?
Dla każdej konkretnej typu matrycy, [W] Czas trwania dodaje trzech szczególnych metod:
Get
/Set
/Address
.
a nawet jeśli demontować tego kodu 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]);
do CIL otrzymuję,
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)
gdzie rozmowy do wspomnianych Get
i Set
metod może być wyraźnie widoczne. Wydaje się, że arytmetyczność tych metod wiąże się z wymiarowością macierzy, która jest prawdopodobnie powodem, dla którego są tworzone przez środowisko wykonawcze i nie są zadeklarowane wcześniej. Nie mogłem znaleźć żadnych informacji o tych metodach na MSDN i ich proste nazwy sprawiają, że są odporne na Googling. Piszę kompilator dla języka, który obsługuje tablice wielowymiarowe, więc chciałbym znaleźć jakąś oficjalną dokumentację na temat tych metod, pod jakimi warunkami mogę się spodziewać, że one istnieją i mogę się spodziewać ich podpisów.
W szczególności chciałbym wiedzieć, czy jego możliwe, aby uzyskać MethodInfo
obiekt dla Get
lub Set
do użytku z Reflection.Emit
bez konieczności tworzenia instancji tablicy z odpowiedniego typu i wymiarowości, na której do refleksji, jak to się dzieje w połączonym przykładzie.
@Rob: czy masz przykład metody "Adres"? Czy masz link opisujący fakt, że te metody są generowane? –
@John - jeśli klikniesz link "ten artykuł" w pierwszym akapicie, skończysz w artykule, z którego pochodzi cytat z drugiego akapitu. –