System.Array sirve como la clase base para todas las matrices en Common Language Runtime (CLR). Según this article:¿Dónde puedo encontrar información sobre los métodos Obtener, Establecer y Dirección para sistemas multidimensionales. Instancias de archivos en .NET?
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 yo desmonte este 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 mencionados métodos Get
y Set
pueden verse claramente. Parece que la aridad de estos métodos está relacionada con la dimensionalidad de la matriz, que es, presumiblemente, por qué son creados por el tiempo de ejecución y no son pre-declarados. No pude encontrar información sobre estos métodos en MSDN y sus nombres simples los hacen resistentes a Google. Estoy escribiendo un compilador para un lenguaje que admite matrices multidimensionales, por lo que me gustaría encontrar documentación oficial sobre estos métodos, bajo qué condiciones puedo esperar que existan y qué puedo esperar de sus firmas.
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 una instancia de la matriz con el tipo correcto y dimensionalidad en el que reflexionar, como se hace en el ejemplo vinculado.
@Rob: ¿tiene un ejemplo para el método 'Dirección'? ¿Y tienes un enlace que describa el hecho de que se generan estos métodos? –
@John: si hace clic en el enlace 'este artículo' en mi párrafo de apertura, terminará en el artículo del cual se toma la cita en el segundo párrafo. –