Wo finde ich Informationen über die Get, Set und Adressmethoden für multidimensionale System.Array Instanzen in .NET finden?

StackOverflow https://stackoverflow.com/questions/2555769

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.

War es hilfreich?

Lösung

Sehen Sie, speziell Abschnitt 14.2 auf den Seiten 63-65

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20II.pdf

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top