¿Dónde puedo encontrar información sobre las get, set y dirección métodos para casos System.Array multidimensionales en .NET?

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

Pregunta

System.Array sirve como la clase base para todas las matrices de Common Language Runtime (CLR). Según este artículo :

  

Para cada tipo de matriz de hormigón, [la] en tiempo de ejecución añade tres métodos especiales:. Get / Set / Address

y de hecho si desensamblar el código 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]);

en CIL consigo,

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)

donde las llamadas a los métodos Get y Set antes mencionados se pueden ver claramente. Parece que la aridad de estos métodos está relacionado con la dimensionalidad de la matriz, que es presumiblemente por la que se crean por el tiempo de ejecución y no están declarados previamente. No pude encontrar ninguna información acerca de estos métodos en MSDN y sus nombres simples hace resistentes a googlear. Estoy escribiendo un compilador para un lenguaje que admite matrices multidimensionales, así que me gustaría encontrar alguna documentación oficial acerca de estos métodos, bajo qué condiciones puedo esperar que ellos existen y lo que pueden esperar que sus firmas sean.

En particular, me gustaría saber si es posible conseguir un objeto MethodInfo para Get o Set para su uso con Reflection.Emit sin tener que crear un ejemplo de la matriz con el tipo correcto y dimensionalidad de que para reflejar, como se hace en el ejemplo vinculado.

¿Fue útil?

Solución

Mira, concretamente en la sección 14.2 en las páginas 63-65

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

Sin embargo, la comida para llevar, y se puede decir de la IL, es que son los métodos get y set para hacer frente a las matrices en las posiciones de índice dado.

  

• Un método GET que tiene una secuencia de   Int32 argumentos, uno para cada   dimensión de la matriz, y devuelve una   valor cuyo tipo es el tipo de elemento   de la matriz. Este método se utiliza para   acceder a un elemento específico de la matriz   donde los argumentos especifican el índice   en cada dimensión, a partir de   la primera, del elemento para ser   devuelto.

     

• Un Conjunto método que toma una secuencia   de Int32 argumentos, uno para cada   dimensión de la matriz, seguido de una   valor cuyo tipo es el tipo de elemento   de la matriz. El tipo de retorno de Set   está vacío. Este método se utiliza para establecer una   elemento específico de la matriz donde   los argumentos especifican en el índice   cada dimensión, a partir de la   primero, del elemento a ser ajustado y   El último argumento especifica el valor   para ser almacenados en el elemento de destino.

     

• Un método de direcciones que toma una   secuencia de argumentos Int32, uno para   cada dimensión de la matriz, y tiene una   Tipo de retorno que es un puntero administrado   el tipo de elemento de la matriz. Esta   método se utiliza para devolver un gestionada   puntero a un elemento específico de la   matriz donde los argumentos especifican la   índice en cada dimensión, a partir de   con la primera, del elemento cuyo   dirección ha de ser devuelto.

Editar Eso es páginas 63-65 usando la numeración de páginas del documento. 73-75 en el PDF real.

Otros consejos

Para responder a su segunda pregunta, no es necesario crear una instancia para obtener una MethodInfo para estos métodos. Algo así como

var mi = typeof(string).MakeArrayType(6).GetMethod("Get");

trabajará para obtener el método Get para el tipo string[,,,,,].

No estoy seguro de si va a dirigir su pregunta muy específica, sino una gran texto sobre el tema (entre otros) es CLR a través de C # . Se pone muy en profundidad para muchos de los temas que le interesan y pasa mucho tiempo con el desensamblador mirando el funcionamiento interno de muchos tipos de base de .NET incluyendo matrices. Merece la pena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top