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

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

il tipo di un è System.Int32 che è uno struct. il tipo di b è int[].dove sono definite le classi int [] e string []?

Vedo la definizione di Int32 in Visual Studio. Dove si trova la definizione di int[]?

+1

La definizione è in mscorlib.dll nello spazio dei nomi di sistema. – PSL

+0

Yo 'int []' è un array di ints. Gli array sono una sorta di elenco, puoi avere una matrice di qualsiasi cosa. Quella sintassi speciale viene copiata da C. Per qualsiasi motivo, non puoi usare la sintassi ordinaria 'Array ', devi usare quella sintassi speciale. –

risposta

8

Per un dato tipo T, il tipo T[] è predefinito, per composizione. Così sono T[][], ecc

+0

Wow! Un drive-by downvote. Perché non dire qual è il problema? –

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 
} 

si può vedere "newarr" Ecco un dettaglio su newarr http://www.dotnetperls.com/newarr

L'istruzione newarr non è molto interessante Ma espone un'importante decisione di progettazione di .NET Framework. I vettori (array 1D) sono separati dagli array 2D. E questa conoscenza può influenzare i tipi che scegli nei programmi.

+1

Questo è interessante, ma questo non sembra rispondere alla domanda –

+0

Quindi int [] non ha un costruttore anche se è inizializzato con nuovo? – user2188831

4

System.Array

La classe Array è la classe di base per le implementazioni di lingua che supportano gli array. Tuttavia, solo il sistema e i compilatori possono derivare esplicitamente dalla classe Array. Gli utenti dovrebbero utilizzare i costrutti dell'array forniti dalla lingua.


più dettagliate:

A partire con il .NET Framework 2.0, la classe Array implementa lo System.Collections.Generic.IList, System.Collections.Generic.ICollection e Sistema. Collections.Generic.Numerose interfacce generiche. Le implementazioni vengono fornite agli array in fase di esecuzione e, pertanto, non sono visibili agli strumenti di documentazione. Di conseguenza, le interfacce generiche non vengono visualizzate nella sintassi della dichiarazione per la classe Array e non vi sono argomenti di riferimento per i membri dell'interfaccia accessibili solo mediante il cast di una matrice al tipo di interfaccia generico (implementazioni esplicite dell'interfaccia). La cosa fondamentale da tenere presente quando si esegue il cast di una matrice su una di queste interfacce è che i membri che aggiungono, inseriscono o rimuovono elementi generano NotSupportedException.

+1

@ user2188831 Probabilmente è la risposta corretta anche se ha meno voti (più 1 da me), nello stesso articolo @talles dice "Le implementazioni sono fornite agli array in fase di esecuzione" = la definizione dell'array è fornita (aka localizzato) da (in) i compilatori C# e JIT. – user1416420