Si bien la especificación C# incluye un preprocesador y directivas básicas (#define, #if, etc.), el idioma no tiene el mismo preprocesador flexible que se encuentra en lenguajes como C/C++. Creo que la falta de un preprocesador tan flexible fue una decisión de diseño hecha por Anders Hejlsberg (aunque, desafortunadamente, no puedo encontrar una referencia a esto ahora). Por experiencia, esta es sin duda una buena decisión, ya que hubo algunas macros realmente imposibles de mantener creadas cuando estaba haciendo mucho C/C++.Preprocesador C#
Dicho esto, hay una serie de situaciones en las que podría encontrar un preprocesador un poco más flexible para ser útil. Código como el siguiente podría mejorarse algunas directivas pre-procesador simples:
public string MyProperty
{
get { return _myProperty; }
set
{
if (value != _myProperty)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
// This line above could be improved by replacing the literal string with
// a pre-processor directive like "#Property", which could be translated
// to the string value "MyProperty" This new notify call would be as follows:
// NotifyPropertyChanged(#Property);
}
}
}
¿Sería una buena idea para escribir un pre-procesador para manejar casos extremadamente simples como esto? Steve McConnell escribió en Code Complete (P208):
Escribe tu propia preprocesador Si un lenguaje no incluye un preprocesador, es bastante fácil de escribir uno ...
Estoy dividido. Fue una decisión de diseño dejar un pre-procesador tan flexible fuera de C#. Sin embargo, un autor que respeto mucho menciona que puede estar bien en algunas circunstancias.
¿Debo crear un preprocesador C#? ¿Hay uno disponible que haga las cosas simples que quiero hacer?
¿Has encontrado una buena solución para esto? La repetición de indicadores y accesadores "IsDirty" por todos lados es una mierda. –
No encontré una solución perfecta, pero tuvimos un gran éxito con IL Weaving a través de [NotifyPropertyWeaver] (https://github.com/SimonCropp/NotifyPropertyWeaver). –
Por lo que vale, he escrito un preprocesador C# que uso para varios propósitos. Hace poco respondí otra pregunta en SO al publicar un preprocesador de C# simple de "prueba de concepto": http: // stackoverflow.com/a/18158212/253938 – RenniePet