2011-08-14 10 views
10

Zgodnie z dokumentacją vs: MakeArrayType() reprezentuje jednowymiarową tablicę z dolną granicą zero. MakeArrayType(1) reprezentuje tablicę o określonej liczbie wymiarów. Na przykład, jeśli UnderlyingSystemType to int, typem zwrotu MakeArrayType() jest System.Int32[], a typem zwrotu MakeArrayType(1) jest System.Int32[*].
Jaka jest różnica między tymi typami.Różnica między .MakeArrayType() i .MakeArrayType (1)

+1

Największy problem polega na tym, że C# nie obsługuje bezpośrednio tablic int [*], musisz użyć tablicy Array. Następna największa transakcja polega na tym, że jitter może generować znacznie lepszy kod dla int [], ponieważ wie z góry, że istnieje tylko jeden wymiar. –

Odpowiedz

17

Istnieje subtelna różnica między .MakeArrayType() i .MakeArrayType(1), jak widać z typu, który jest zwracany (Int32[] versus Int32[*]). Zgodnie z dokumentacją dla .MakeArrayType():

Uwaga: plików wykonywalnych języka wspólnego rozróżnia wektorów (czyli jednowymiarowe tablice, które są zawsze od zera) i tablice wielowymiarowe. Wektor, który ma zawsze tylko jeden wymiar , nie jest tym samym, co wielowymiarowa tablica, która zdarza się mieć tylko jeden wymiar. Przeciążenie tej metody może być używane tylko do tworzenia typów wektorowych i jest to jedyny sposób na utworzenie typu wektorowego. Użyj przeciążenia metody MakeArrayType (Int32), aby utworzyć wielowymiarowe typy tablic . Source

Więc kiedy zadzwonisz .MakeArrayType() zwraca wektor (który jest specjalnym rzeczą, która zawsze ma jeden wymiar). Wywołanie .MakeArrayType(1) tworzy tablicę wielowymiarową (a nie wektor) - tak się składa, że ​​ma tylko jeden wymiar.

Różnica między Vectorem i Arrayem jest dość techniczna, ale w zasadzie Wektory otrzymują specjalne traktowanie przez CLR, więc istnieją dodatkowe instrukcje IL, które działają z nimi i które mogą zwiększyć ich wydajność. Aby uzyskać więcej informacji na temat różnicy między tablicami i wektorami, zobacz: http://markettorrent.com/community/7968#Vectors vs. Arrays

+0

Dobrze odpowiedział. To mnie trochę złapało: http://marcgravell.blogspot.com/2010/03/when-is-int-not-int.html –

+1

Dziwne rzeczy. Nawet tutaj konwencje nazewnictwa są niespójne: wektor nazywa się 'Int32 [*]' tablice są nazywane 'Int32 []' i 'Int32 [,]'. – CodesInChaos

Powiązane problemy