¿Dónde puedo encontrar información sobre las get, set y dirección métodos para casos System.Array multidimensionales en .NET?
-
23-09-2019 - |
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.
Solución
Mira, concretamente en la sección 14.2 en las páginas 63-65
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.