world pintar how hello desde consola compiler compilar compilador c# compiler-construction debugging

pintar - main c#



Dónde aprender sobre depurador VS ''nombres mágicos'' (1)

Estos son detalles de implementación no documentados del compilador y están sujetos a cambios en cualquier momento. (ACTUALIZACIÓN: consulte GeneratedNames.cs en las fuentes de C # para conocer los detalles actuales; la descripción que figura a continuación está un poco desactualizada).

Sin embargo, como soy un buen tipo, estos son algunos de esos detalles:

Si tiene una variable local no utilizada que el optimizador elimina, emitimos información de depuración de todos modos en el PDB. Pusimos el sufijo __Deleted$ en dichas variables para que el depurador sepa que estaban en el código fuente pero no representados en el binario.

Los espacios variables temporales asignados por el compilador reciben nombres con el patrón CS $ X $ Y, donde X es el "tipo temporal" e Y es el número de temporales asignados hasta el momento. Los tipos temporales son:

0 --> short lived temporaries 1 --> return value temporaries 2 --> temporaries generated for lock statements 3 --> temporaries generated for using statements 4 --> durable temporaries 5 --> the result of get enumerator in a foreach 6 --> the array storage in a foreach 7 --> the array index storage in a foreach.

Los tipos temporales entre 8 y 264 son almacenamientos de índices de matriz adicionales para matrices multidimensionales.

Los tipos temporales superiores a 264 se usan para los temporales que implican la instrucción fija que arregla una cadena.

Los nombres especiales generados por el compilador se generan para:

1 --> the iterator state ("state") 2 --> the value of current in an iterator ("current") 3 --> a saved parameter in an iterator 4 --> a hoisted ''this'' in an iterator ("this") 5 --> a hoisted local in an iterator 6 --> the hoisted locals from an outer scope 7 --> a hoisted wrapped value ("wrap") 8 --> the closure class instance ("locals") 9 --> the cached delegate instance ("CachedAnonymousMethodDelegate") a --> the iterator instance ("iterator") b --> an anonymous method c --> anonymous method closure class ("DisplayClass") d --> iterator class e --> fixed buffer struct ("FixedBuffer") f --> anonymous type ("AnonymousType") g --> initializer local ("initLocal") h --> query expression temporary ("TransparentIdentifier") i --> anonymous type field ("Field") j --> anonymous type type parameter ("TPar") k --> auto prop field ("BackingField") l --> iterator thread id m --> iterator finally ("Finally") n --> fabricated method ("FabricatedMethod") o --> dynamic container class ("SiteContainer") p --> dynamic call site ("Site") q --> dynamic delegate ("SiteDelegate") r --> com ref call local ("ComRefCallLocal") s --> lock taken local ("LockTaken")

El patrón para generar nombres mágicos es: P<N>C__SI donde:

  • P es CS $ para los delegados en caché y las instancias de clase de visualización, de lo contrario, vacíe.
  • N es el nombre original asociado con la cosa, si hay alguna
  • C es el carácter 1 a s mencionado anteriormente
  • S es un sufijo descriptivo ("actual", "estado", etc.) para que no tenga que memorizar la tabla anterior al leer los metadatos.
  • I es un número único opcional

Si alguna vez ha usado Reflector, probablemente haya notado que el compilador C # genera tipos, métodos, campos y variables locales que merecen una visualización "especial" por parte del depurador. Por ejemplo, las variables locales que comienzan con ''CS $'' no se muestran al usuario. Existen otras convenciones de nomenclatura especiales para tipos de cierre de métodos anónimos, campos de respaldo de propiedades automáticas, etc.

Mi pregunta: ¿dónde aprender sobre estas convenciones de nombres? ¿Alguien sabe sobre alguna documentación?

Mi objetivo es hacer que PostSharp 2.0 use las mismas convenciones.