2010-03-31 6 views
6

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.

+0

@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? –

+0

@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. –

Respuesta

5

mira aquí, 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

Pero 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 dadas.

• Un método Get que tiene una secuencia de argumentos Int32, una para cada dimensión de la matriz, y devuelve un valor cuyo tipo es el tipo de elemento de la matriz. Este método se usa para acceder a un elemento específico de la matriz donde los argumentos especifican el índice en cada dimensión, comenzando con el primero, del elemento que se va a devuelto.

• Un método Set que toma una secuencia de argumentos Int32, una para cada dimensión de la matriz, seguido por un valor cuyo tipo es el tipo de elemento de la matriz. El tipo de devolución de Set es nulo.Este método se utiliza para fijar un elemento específico de la matriz donde los argumentos especifican el índice en cada dimensión, comenzando con el primero, del elemento a ser ajustado y el argumento final especifica el valor a almacenar en el elemento objetivo

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

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

+0

¡Excelente! Eso es exactamente lo que estaba buscando. Gracias. –

1

No estoy seguro de si abordará su pregunta específica pero un gran texto sobre el tema (entre otros) es CLR via C#. Es muy profundo para muchos de los temas que le interesan y pasa mucho tiempo con el desensamblador observando el funcionamiento interno de muchos tipos básicos de .NET, incluidas las matrices. Definitivamente vale la pena echarle un vistazo.

+0

Gracias por recordarme que miro CLR a través de C#, que tengo aquí. Acabo de leer el Capítulo 13: Arrays pero no puedo ver ninguna mención de los métodos Get, Set y Address. –

2

Para responder a su segunda pregunta, no necesita crear una instancia para obtener un 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[,,,,,].

+0

¡Espléndido! Ahora tengo todo lo que vine a buscar. –

+1

Posteriormente descubrí que se requiere cuidado al seleccionar entre las sobrecargas de MakeArrayType. Sin argumentos: MakeArrayType() crea un tipo de vector como string []. Con un argumento de uno: MakeArrayType (1) crea una matriz multidimensional con una dimensión de tipo cadena [*]. Estos tipos no son compatibles. Para la interoperabilidad con los otros lenguajes .NET, esto significa que cuando el rango == 1 necesitará especial-caso la llamada al método sin parámetros. –

Cuestiones relacionadas