2011-08-14 9 views
10

De acuerdo con la documentación de vs: MakeArrayType() representa una matriz dimensional con un límite inferior de cero. MakeArrayType(1) representa una matriz con un número específico de dimensiones. Por ejemplo, si UnderlyingSystemType es int, el tipo de devolución de MakeArrayType() es System.Int32[] y el tipo de devolución de MakeArrayType(1) es System.Int32[*].
Cuál es la diferencia entre esos tipos.Diferencia entre .MakeArrayType() y .MakeArrayType (1)

+1

El mayor problema es que C# no admite directamente las matrices int [*], debe utilizar Array. El siguiente gran problema es que el jitter puede generar código mucho mejor para int [] ya que sabe por adelantado que solo hay una dimensión. –

Respuesta

17

Hay una diferencia sutil entre .MakeArrayType() y .MakeArrayType(1) como ha visto en el tipo que se devuelve (Int32[] versus Int32[*]). De acuerdo con la documentación para .MakeArrayType():

Nota: El tiempo de ejecución de lenguaje común hace una distinción entre los vectores (es decir, matrices unidimensionales que siempre están basados ​​en cero) y matrices multidimensionales. Un vector, que siempre tiene una sola dimensión , no es lo mismo que una matriz multidimensional que ocurre con tiene solo una dimensión. Esta sobrecarga de métodos solo se puede usar para crear tipos de vectores, y es la única manera de crear un tipo de vector. Utilice la sobrecarga del método MakeArrayType (Int32) para crear tipos de matriz multidimensionales . Source

Así que cuando se llama a .MakeArrayType() devuelve un vector (que es una cosa especial que siempre tiene una dimensión). Llamar al .MakeArrayType(1) hace una matriz multidimensional (no un Vector) - simplemente sucede que solo tiene una dimensión única.

La diferencia entre un Vector y un Array es bastante técnica, pero básicamente los Vectores reciben un trato especial por parte del CLR, de modo que hay instrucciones adicionales de IL que funcionan con ellos y que pueden hacerlos más eficientes. Para obtener más información acerca de la diferencia entre matrices y vectores, consulte: http://markettorrent.com/community/7968#Vectors vs. Arrays

+0

Bien respondido. Esto me llamó la atención hace un tiempo: http://marcgravell.blogspot.com/2010/03/when-is-int-not-int.html –

+1

Cosas extrañas. Incluso las convenciones de nomenclatura aquí son inconsistentes: el vector se llama 'Int32 [*]' las matrices se llaman 'Int32 []' y 'Int32 [,]'. – CodesInChaos

Cuestiones relacionadas