2012-02-02 12 views
7

Noté algo curioso cuando jugueteaba con las clases anidadas y daba el nombre del tipo a una ventana de la consola. Me preguntaba si alguien podría explicarlo un poco por mí. Cuando llamo al GetType() en la clase principal, devuelve lo que esperaría, que era el nombre de la clase después de los espacios de nombres relevantes. es decir Namespace.Namespace.ClassnameClase anidada .GetType()

Sin embargo, cuando llamo a una función desde dentro de la clase envolvente para devolver el tipo de la clase anidada puedo obtener el valor devuelto como esto:

Namespace.Namespace.ClassNameEnclosing + ClassNameNested. 

¿Por qué no regresó simplemente como notación de puntos . ¿Por qué el símbolo +? Solo tengo curiosidad por saber qué está sucediendo en el fondo que causa esta notación.

Respuesta

5

Los puntos se utilizan para denotar espacios de nombres. La clase anidada todavía está en el mismo espacio de nombres, está anidada dentro de una clase.

No puedo decir de improviso (a partir de un breve estudio de ECMA-335) si un nombre de tipo no calificado que incluye un punto sería realmente válido en IL; I sospechoso, pero dificultaría la lectura de todo tipo de diagnósticos.

+0

Gracias por la respuesta. Veo que si bien la clase es una clase en sí misma, ¿no tiene su propio espacio de nombres? El símbolo más básicamente indica que este tipo es una adición al espacio de nombres de la clase adjunta. – CSharpened

+0

@CSharpened: Sí, ese es su espacio de nombres: si nos fijamos en el espacio de nombres de (por ejemplo) 'System.Collections.Generic.SortedDictionary .ValueCollection', encontrará que es simplemente' System.Collections.Generic'. –

+0

Excelente respuesta. Gracias. Eso lo deja muy claro. – CSharpened

1

La reflexión no es específica del idioma.

La notación de puntos (Namespace.Namespace.OuterClassName.InnerClassName) es específica de C#. La reflexión debe funcionar para cada idioma que pueda usar para compilar a IL. Además, ¿cómo puede estar seguro, al reflexionar, de que el OuterClassName no es solo otra parte del espacio de nombres sin examinar otras propiedades de la clase Type?

Usted pregunta por qué no es simple devuelto como notación de punto? También podría preguntar "¿Por qué no se devuelve simplemente como notación IronPython?", O notación IronLisp, o notación L #, o notación BOo, o ...

Aprenda la notación utilizada en la reflexión, y puede usarla para analizar código escrito en cualquier idioma.