Dove posso trovare informazioni sulle Get, Set e indirizzo metodi per le istanze System.Array multidimensionali in .NET?
-
23-09-2019 - |
Domanda
System.Array serve come classe base per tutte le matrici in Common Language Runtime (CLR). Secondo questo articolo :
Per ogni tipo di matrice in calcestruzzo, [la] runtime aggiunge tre metodi speciali:.
Get
/Set
/Address
e in effetti se smontare il codice 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]);
in CIL ricevo,
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)
dove le chiamate ai suddetti metodi Get
e Set
può essere visto chiaramente. Sembra che l'arietà di questi metodi è correlata alla dimensionalità della matrice, che è presumibilmente perché sono creati dal runtime e non sono pre-dichiarate. Non ho potuto trovare tutte le informazioni su questi metodi su MSDN ed i loro nomi semplici li rende resistenti a usare Google. Sto scrivendo un compilatore per un linguaggio che supporta array multidimensionali, quindi mi piacerebbe trovare qualche documentazione ufficiale su questi metodi, in quali condizioni posso aspettarmi loro di esistere e quello che possono aspettarsi le loro firme siano.
In particolare, vorrei sapere se la sua possibile ottenere un oggetto MethodInfo
per Get
o Set
per l'uso con Reflection.Emit
senza dover creare un esempio della matrice con il tipo corretto e dimensionalità sulla cui riflettere, come avviene nell'esempio collegato.
Soluzione
Guardate qui, in particolare la sezione 14.2 a pagina 63-65
Ma l'asporto, e si può dire dal IL, è che sono i metodi getter e setter per trattare con gli array a una data posizioni di indice.
• Un metodo Get che prende una sequenza di argomenti Int32, uno per ciascun dimensione della matrice, e restituisce un valore il cui tipo è il tipo di elemento dell'array. Questo metodo viene utilizzato per accedere ad un elemento specifico dell'array dove gli argomenti specificano l'indice in ogni dimensione, a partire da il primo, dell'elemento di essere restituito.
• un metodo set che prende una sequenza di argomenti di Int32, uno per ciascun dimensione della matrice, seguita da una valore il cui tipo è il tipo di elemento dell'array. Il tipo di ritorno di Set è nullo. Questo metodo viene utilizzato per impostare un elemento specifico dell'array dove gli argomenti specificano l'indice in ogni dimensione, a partire dal prima, dell'elemento da impostare e l'ultimo argomento specifica il valore per essere memorizzati nell'elemento di destinazione.
• Un metodo che prende un indirizzo sequenza di argomenti Int32, uno per ogni dimensione della matrice, e ha un tipo di ritorno che è un puntatore gestito al tipo di elemento della matrice. Questo metodo viene utilizzato per restituire un gestito puntatore a un elemento specifico della array in cui gli argomenti specificano la indice in ogni dimensione, a partire con il primo, dell'elemento cui l'indirizzo deve essere restituito.
Modifica Ecco le pagine 63-65 usando la numerazione delle pagine del documento. 73-75 nel PDF vero e proprio.
Altri suggerimenti
Per rispondere alla tua seconda domanda, non è necessario creare un'istanza per ottenere un MethodInfo
per questi metodi. Qualcosa di simile
var mi = typeof(string).MakeArrayType(6).GetMethod("Get");
lavorerà per ottenere il metodo Get
per il tipo di string[,,,,,]
.
Non sono sicuro se sarà rispondere alla sua domanda molto specifica, ma un grande testo sull'argomento (tra gli altri) è CLR via C # . Diventa molto in profondità per molti degli argomenti che ti interessa e spende un sacco di tempo con il disassemblatore guardando il funzionamento interno di molti tipi di base .NET compresi gli array. Sicuramente vale la pena di verificare.