Dove posso trovare informazioni sulle Get, Set e indirizzo metodi per le istanze System.Array multidimensionali in .NET?

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

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.

È stato utile?

Soluzione

Guardate qui, in particolare la sezione 14.2 a pagina 63-65

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top