le C# faq.
Pourquoi ne pas C# soutien #définir des macros?
En C++, je peux définir une macro tels que:
#define PRODUCT(x, y, z) x * y * z
et puis l'utiliser dans le code:
int a = PRODUCT(3, 2, 1);
C# ne vous permettra pas de le faire. Pourquoi?
Il ya quelques raisons pourquoi. La première est l'une des raisons de lisibilité.
L'un de nos principaux objectifs de conception pour le C# est pour avoir un code très lisible. Avoir la capacité à écrire des macros donne au programmeur la possibilité de créer leur propre langage - celui qui n'a pas nécessairement avoir aucune relation avec ce que le code en dessous. Pour comprendre ce que fait le code, l'utilisateur ne doit pas seulement comprendre comment la langue fonctionne, mais il faut aussi comprendre tous les #définir des macros qui sont en vigueur à ce point dans le temps. Qui rend le code beaucoup plus difficile à lire.
En C#, vous pouvez utiliser les méthodes au lieu de macros, et dans la plupart des cas, l'équipe inline, et vous donne le même aspect performance.
Il y a aussi un peu le problème plus subtil. Les Macros sont fait sous forme de texte, ce qui signifie que si j'écris:
int y = PRODUCT (1 + 2, 3 + 4, 5 + 6)
Je m'attends à quelque chose qui me donne l' 3 * 7 *11 = 231
, mais en fait, l'extension, j'ai défini il donne:
int y = 1 + 2 * 3 + 4 * 5 + 6;
ce qui me donne 33. Je peux contourner en une application judicieuse de la parenthèse, mais il est très facile à écrire une macro qui fonctionne dans certaines situations et pas dans d'autres.
Bien que le C# n'est pas à proprement parler un pré-processeur, il comporte des symboles de compilation conditionnelle qui peut être utilisée pour affecter la compilation. Ceux-ci peuvent être définies dans le code ou avec des paramètres pour le compilateur. Le "pré-traitement" directives en C# (nommé uniquement pour des raisons de cohérence avec le C/C++, malgré l'absence de séparer les pré-étape de traitement) sont (texte de la spécification ECMA):
#define and #undef
Utilisé pour définir et d'annuler la définition des symboles de compilation conditionnelle
#if, #elif, #else and #endif
Utilisé pour conditionnellement ignorer des sections de code source
#line
Utilisé pour contrôler les numéros de ligne émis des erreurs et des avertissements.
#error and #warning
Utilisé pour émettre des erreurs et des avertissements.
#region and #endregion
Utilisé pour marquer explicitement les sections de code source.
Voir la section 9.5 de la spécification ECMA pour plus d'informations sur le dessus de. Compilation conditionnelle peut également être réalisé à l'aide de l'attribut Conditionnel sur une méthode, de sorte que les appels à la méthode ne pourra être compilé lorsque le symbole est défini. Voir la section 24.4.2 de l'ECMA caractéristiques pour plus d'informations sur cette.
Auteur: Eric Gunnerson