2010-03-31 14 views
6

System.Array służy jako klasa podstawowa dla wszystkich tablic w Common Language Runtime (CLR). Według this article:Gdzie mogę znaleźć informacje na temat metod Get, Set i Address dla wielowymiarowych instancji System.Array w .NET?

Dla każdej konkretnej typu matrycy, [W] Czas trwania dodaje trzech szczególnych metod: Get/Set/Address.

a nawet jeśli demontować tego kodu 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]); 

do CIL otrzymuję,

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) 

gdzie rozmowy do wspomnianych Get i Set metod może być wyraźnie widoczne. Wydaje się, że arytmetyczność tych metod wiąże się z wymiarowością macierzy, która jest prawdopodobnie powodem, dla którego są tworzone przez środowisko wykonawcze i nie są zadeklarowane wcześniej. Nie mogłem znaleźć żadnych informacji o tych metodach na MSDN i ich proste nazwy sprawiają, że są odporne na Googling. Piszę kompilator dla języka, który obsługuje tablice wielowymiarowe, więc chciałbym znaleźć jakąś oficjalną dokumentację na temat tych metod, pod jakimi warunkami mogę się spodziewać, że one istnieją i mogę się spodziewać ich podpisów.

W szczególności chciałbym wiedzieć, czy jego możliwe, aby uzyskać MethodInfo obiekt dla Get lub Set do użytku z Reflection.Emit bez konieczności tworzenia instancji tablicy z odpowiedniego typu i wymiarowości, na której do refleksji, jak to się dzieje w połączonym przykładzie.

+0

@Rob: czy masz przykład metody "Adres"? Czy masz link opisujący fakt, że te metody są generowane? –

+0

@John - jeśli klikniesz link "ten artykuł" w pierwszym akapicie, skończysz w artykule, z którego pochodzi cytat z drugiego akapitu. –

Odpowiedz

5

Spójrz tutaj, a konkretnie sekcja 14.2 na stronach 63-65

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20II.pdf

Ale wynos, i można powiedzieć od IL, jest to, że są metody getter i setter do czynienia z tablicami na danych pozycjach indeksu.

• metody GET, które ma sekwencję Int32 argumentów, po jednym dla każdego wymiar tablicy i zwraca wartość którego typ to typ elementu tablicy. Ta metoda jest używana do uzyskania dostępu do określonego elementu tablicy , w którym argumenty określają indeks w każdym wymiarze, począwszy od , pierwszego zwracanego elementu, który ma być .

• ze sposobem, który odbywa się w kolejności Int32 argumentów, po jednej dla każdego wymiaru tablicy, a następnie wartości którego typ jest typ elementu tablicy. Zwrot typu zestawu jest nieważny.Metoda ta służy do ustawiania konkretny element tablicy gdzie argumenty określić wskaźnik do każdy wymiar, począwszy najpierw elementu należy ustawić i ostatni argument określa wartość być przechowywane w element docelowy.

• metoda Adres że trwa sekwencji Int32 argumentów, jeden dla każdego wymiaru tablicy i ma typ powrotny, który jest zarządzany wskaźnik do typu elementu w tablicy. Ta metoda służy do powrotu do zarządzanej wskaźnik do konkretnego elementu tablicy gdzie argumenty określić indeks w każdym wymiarze, począwszy z pierwszym, elementu, którego adres ma być zwrócony.

Edit: to strona 63-65 stosując numerację stron dokumentu. 73-75 w rzeczywistym pliku PDF.

+0

Doskonale! Właśnie tego szukałem. Dziękuję Ci. –

1

Nie jestem pewien, czy rozwiąże to twoje bardzo szczegółowe pytanie, ale świetny tekst na ten temat (między innymi) to CLR via C#. Jest bardzo obszerny dla wielu tematów, które cię interesują i spędza dużo czasu z dezasemblerem, patrząc na funkcjonowanie wielu podstawowych typów .NET, w tym tablic. Zdecydowanie warte sprawdzenia.

+0

Dzięki za przypomnienie mi, aby spojrzeć na CLR za pośrednictwem C#, które mam tutaj. Właśnie przeczytałem rozdział 13: Tablice, ale nie widzę żadnej wzmianki o metodach Get, Set i Address. –

2

Aby odpowiedzieć na drugie pytanie, nie trzeba tworzyć instancji, aby uzyskać MethodInfo dla tych metod. Coś jak

var mi = typeof(string).MakeArrayType(6).GetMethod("Get"); 

będzie działać, aby uzyskać metody Get dla typu string[,,,,,].

+0

Splendid! Teraz mam wszystko, po co przyszedłem. –

+1

Następnie odkryłem, że należy zachować ostrożność podczas wybierania między przeciążeniami metody MakeArrayType. Bez argumentów - MakeArrayType() tworzy typ wektorowy, taki jak string []. Z argumentem jednego - MakeArrayType (1) tworzy wielowymiarową tablicę z jednym wymiarem ciągu znaków [*]. Te typy nie są kompatybilne. W celu zapewnienia współdziałania z innymi językami .NET oznacza to, że gdy ranga == 1, konieczne będzie specjalne wywołanie metody bez parametrów. –

Powiązane problemy