Wo finde ich Informationen über die Get, Set und Adressmethoden für multidimensionale System.Array Instanzen in .NET finden?
-
23-09-2019 - |
Frage
System.Array dient als Basisklasse für alle Arrays in der Common Language Runtime (CLR). diesen Artikel
Für jeden konkrete Array-Typen, [die] Laufzeit fügt drei spezielle Methoden.
Get
/Set
/Address
und in der Tat, wenn ich zerlegen diesen C # -Code,
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]);
in CIL ich,
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)
, wo die Anrufe zu den oben genannten Get
und Set
Methoden deutlich zu erkennen sind. Es scheint, die arity dieser Methoden auf die Dimensionalität des Arrays verbunden sind, die vermutlich ist, warum sie von der Laufzeit erstellt werden und nicht im Voraus angemeldet werden. Ich konnte keine Informationen über diese Methoden auf MSDN finden und ihre einfachen Namen macht sie zu googeln resistent. Ich bin ein Compiler für eine Sprache zu schreiben, den mehrdimensionale Arrays unterstützt, so Ich mag würde eine offizielle Dokumentation über diese Methoden zu finden, unter welchen Bedingungen ich erwarten kann, sie existieren und was kann ich erwarten, dass ihre Unterschriften sein.
Insbesondere würde Ich mag, ob ihre möglich wissen, ein MethodInfo
Objekt für Get
oder Set
für die Verwendung mit Reflection.Emit
zu erhalten, ohne eine Instanz des Arrays mit dem richtigen Art und Dimensionalität zu erstellen, die auf was zu reflektieren, wie es in dem verknüpften Beispiel getan.
Lösung
Sehen Sie, speziell Abschnitt 14.2 auf den Seiten 63-65
Aber die Gerichte zum Mitnehmen, und Sie von der IL sagen können, ist, dass sie die Getter und Setter-Methoden für den Umgang mit Arrays bei den gegebenen Indexpositionen sind.
• Ein Get-Methode, die eine Sequenz von Takes int32 Argumente, einer für jeden Dimension des Arrays, und gibt eine Wert, dessen Typ ist der Elementtyp des Arrays. Dieses Verfahren wird verwendet, um Zugriff auf ein bestimmtes Element des Arrays wobei die Argumente geben Sie den Index in jeder Dimension, beginnend mit Die erste, die des Elements zu sein zurückgegeben.
• Ein Set-Methode, die eine Sequenz dauert int32 der Argumente, einer für jeden Dimension des Arrays, gefolgt von einer Wert, dessen Typ ist der Elementtyp des Arrays. Der Rückgabetyp Set ist nichtig. Dieses Verfahren ist auf einem Satz verwendet spezifisches Element des Arrays, wo die Argumente geben den Index in jede Dimension, beginnend mit dem Zuerst des Elements festgelegt werden, und Das letzte Argument gibt den Wert gespeichert in das Zielelement werden.
• Eine Adresse Methode, die eine nimmt Sequenz von int32 Argumenten, einer für jede Dimension des Arrays, und hat eine Rückgabetyp, der einen verwalteten Zeiger auf den Elementtyp des Arrays. Dies Methode wird ein verwaltetes zurückzukehren Zeiger auf ein bestimmtes Element der Array, wobei die Argumente, die angeben, Index für jede Dimension Anfang mit dem ersten, des Elements, dessen Adresse zurückgegeben werden soll.
Edit: Das ist Seiten 63-65 die Seitennummerierung des Dokuments verwendet wird. 73-75 in der eigentlichen PDF.
Andere Tipps
Ihre zweite Frage zu beantworten, müssen Sie keine Instanz erstellen MethodInfo
für diese Methoden zu erhalten. So etwas wie
var mi = typeof(string).MakeArrayType(6).GetMethod("Get");
arbeiten, um die Get
Methode zum string[,,,,,]
Typ erhalten.
Ich bin mir nicht sicher, ob es Ihre ganz konkrete Frage, aber einen großen Text zu diesem Thema befassen wird (unter anderem) ist CLR via C # . Es wird sehr intensiv für viele der Themen, die Sie interessiert sind und verbringt viel Zeit mit dem Disassembler in das Innenleben von vielen Basis .NET-Typen einschließlich Arrays suchen. Auf jeden Fall einen Besuch wert.