2012-02-02 16 views
7

Ho notato qualcosa di curioso quando si scherzava con classi nidificate e si trasmetteva il nome del tipo in una finestra della console. Mi stavo chiedendo se qualcuno potesse spiegarlo un po 'per me. Quando si chiama GetType() sulla classe principale, restituisce ciò che mi aspetto, che era il nome della classe dopo gli spazi dei nomi rilevanti. cioè Namespace.Namespace.ClassnameClasse nidificata .GetType()

Tuttavia, quando chiamo una funzione all'interno della classe contenitrice per restituire il tipo della classe annidata ho ottenere il valore restituito come questo:

Namespace.Namespace.ClassNameEnclosing + ClassNameNested. 

Perché non è semplicemente restituito come notazione punto . Perché il simbolo +? Sono solo curioso di sapere cosa sta succedendo in background che causa questa notazione.

risposta

5

I punti sono utilizzati per indicare gli spazi dei nomi. La classe nidificata si trova ancora nello stesso spazio dei nomi, è solo annidata all'interno di una classe.

Non riesco a capire (da un breve studio dell'ECMA-335) se un nome di tipo non qualificato che includeva un punto sarebbe effettivamente valido in IL; I sospetto lo farebbe, ma renderebbe tutti i tipi di diagnostica più difficili da leggere.

+0

Grazie per la risposta. Lo vedo anche se la classe è una classe a sé stante e non ha un proprio spazio dei nomi? Il simbolo più afferma fondamentalmente che questo tipo è un'aggiunta allo spazio dei nomi della classe che racchiude? – CSharpened

+0

@CSharpened: Sì, questo è il suo spazio dei nomi - se si guarda lo spazio dei nomi di (say) 'System.Collections.Generic.SortedDictionary .ValueCollection', si troverà semplicemente' System.Collections.Generic'. –

+0

Ottima risposta. Grazie. Questo lo rende molto chiaro. – CSharpened

1

La riflessione non è specifica della lingua.

La notazione punto (Namespace.Namespace.OuterClassName.InnerClassName) è specifica per C#. La riflessione deve funzionare per ogni lingua che è possibile utilizzare per compilare in IL. Inoltre, come si può essere sicuri, quando si riflette, che lo OuterClassName non è solo un'altra parte del namespace senza esaminare altre proprietà della classe Type?

Si chiede perché non è semplice restituito come notazione dot? Potresti anche chiedere "Perché non viene semplicemente restituito come notazione IronPython", o notazione IronLisp, o notazione L # o notazione BOo, o ...

Impara la notazione usata in riflessione e puoi usarla analizzare il codice scritto in qualsiasi lingua

Problemi correlati