2010-03-14 5 views
8
nombre

Clase: MyAssembly.MyClass+MyOtherClass¿Tiene un "+" en el nombre de la clase?

El problema es, obviamente, el + como separador, en lugar de puntos traditionnal, su función, y encontrar documentación oficial para ver si existen otros separadores.

+0

¿Por qué necesita saber esto? ¿Qué estás tratando de lograr con este conocimiento? –

Respuesta

13

eso es sólo la forma en que un tipo anidado está representado. Así, por ejemplo:

namespace Foo 
{ 
    class Outer 
    { 
     class Nested {} 
    } 
} 

creará un tipo con un nombre completo de Foo.Outer+Nested en el código compilado. (Y eso es lo typeof(Outer.Nested).FullName volvería, por ejemplo.)

No es claro si esto es especifica el comportamiento, o simplemente lo que el compilador Microsoft C# opta por utilizar; es un nombre "indescriptible" porque no se puede declarar explícitamente una clase con un + en él en C# normal, por lo que el compilador sabe que no chocará con ninguna otra cosa. La sección 10.3.8 de la especificación C# 3 no dicta el nombre compilado hasta donde puedo ver.

EDIT: Acabo de ver que Type.AssemblyQualifiedName especifica que "+" se utiliza para preceder a un nombre de tipo anidado ... pero todavía no está claro si o no que en realidad es requerido o simplemente convencional.

+2

Otra forma en que este detalle de implementación se manifiesta es en tipos genéricos anidados. Si tiene la clase Outer con la clase anidada Inner , verá que lo que realmente obtiene en los metadatos son dos tipos, Outer <'1> y Outer + Inner <'2>. Los tipos anidados son desde la perspectiva de CLR realmente solo una fib conveniente indicada por el lenguaje. El anidamiento se manifiesta "de verdad" casi solo en la capacidad del tipo interno de acceder a los miembros privados del tipo externo. (Los espacios de nombres son similarmente una ficción.) –

+0

Si el nombre de la clase anidada fue simplemente elegido por el compilador C# de Microsoft, ¿cómo sería posible la interoperabilidad con otros compiladores? ¿Significa que no se pueden usar clases anidadas si, por ejemplo, usando el compilador Mono? –

+0

divo: Supongo que el compilador C# de Mono sigue el mismo esquema que el de Microsoft. Del mismo modo en cualquier otro lugar donde algo no se especifica en la especificación de C#. –

10

Esto es lo que el compilador usa en los metadatos para representar una clase anidada.

decir

class A { class B {} } 

sería visto como

class A+B 

en los metadatos

+1

gracias. ¿Este es el único signo que podemos encontrar de esta manera? – Graveen

+0

Estaba mirando la biblioteca .NET (1.1) en ILDASM y los tipos anidados allí mostraban '/' como separador. –

+0

Entonces ILDASM miente. –

Cuestiones relacionadas