2013-03-20 6 views
6
int a = 0; 
int[] b = new int[3]; 

Console.WriteLine(a.GetType()); 
Console.WriteLine(b.GetType()); 

typ jest System.Int32 który jest struktura. Typ b to int[].gdzie są zdefiniowane klasy int [] i string []?

Widzę definicję Int32 w Visual Studio. Gdzie znajduje się definicja int[]?

+1

Definicja znajduje się w mscorlib.dll w obszarze nazw systemowych. – PSL

+0

Yo 'int []' jest tablicą intów. Tablice są rodzajem listy, możesz mieć całą gamę czegokolwiek. Ta specjalna składnia jest kopiowana z C. Z jakiegoś powodu nie możesz użyć zwykłej składni 'Array ', musisz użyć tej specjalnej składni. –

Odpowiedz

8

Dla danego typu T wstępnie zdefiniowano typ T[] według kompozycji. Więc są T[][] itp

+0

Wow! Przejazd w dół. Dlaczego nie powiedzieć, jaki jest problem? –

2

C#:

static void Main(string[] args) 
     { 
      int a = 0; 
      int[] b = new int[3]; 
     } 

IL:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    //  11 (0xb) 
    .maxstack 1 
    .locals init ([0] int32 a, 
      [1] int32[] b) 
    IL_0000: nop 
    IL_0001: ldc.i4.0 
    IL_0002: stloc.0 
    IL_0003: ldc.i4.3 
    IL_0004: **newarr**  [mscorlib]System.Int32 
    IL_0009: stloc.1 
    IL_000a: ret 
} 

widać "newarr" Tutaj jest szczegół o newarr http://www.dotnetperls.com/newarr

dyspozycja newarr nie jest bardzo interesujący. Ale ujawnia ważną decyzję projektową .NET Framework. Wektory (tablice 1D) są oddzielone od tablic 2D. I ta wiedza może wpływać na typy, które wybierzesz w programach.

+1

To jest interesujące, ale tak naprawdę nie wydaje się odpowiadać na pytanie –

+0

Więc int [] nie ma konstruktora, mimo że jest on inicjowany nowymi? – user2188831

4

System.Array

Klasa Array jest klasą bazową dla wdrożeń językowych, które obsługują macierze. Jednak tylko system i kompilatory mogą wyprowadzać jawnie z klasy Array. Użytkownicy powinni stosować konstrukcje tablicowe dostarczone przez język.


Bardziej szczegółowe:

Począwszy Framework 2.0, klasa Array implementuje System.Collections.Generic.IList, System.Collections.Generic.ICollection i systemu. Collections.Generic.Numeryczne interfejsy ogólne. Implementacje są dostarczane do tablic w czasie wykonywania, a zatem nie są widoczne w narzędziach do tworzenia dokumentacji. W wyniku tego ogólne interfejsy nie pojawiają się w składni deklaracji dla klasy Array i nie ma tematów odniesienia dla elementów interfejsu, które są dostępne tylko poprzez rzutowanie tablicy na ogólny typ interfejsu (jawne implementacje interfejsu). Kluczową rzeczą, o której należy pamiętać, kiedy rzuca się tablicę na jeden z tych interfejsów, jest to, że członkowie dodający, wstawiający lub usuwają elementy, rzucają wyjątek NotSupportedException.

+1

@ user2188831 Jest to prawdopodobnie poprawna odpowiedź, mimo że ma najmniej głosów (plus 1 ode mnie), w tym samym artykule @talles zapewnia, że ​​"Implementacje są dostarczane do tablic w czasie wykonywania" = podano definicję tablicy (alias umieszczony) przez (w) kompilatory C# i JIT. – user1416420