Die Antwort hierzu ist recht simpel: Genau genommen sind dies nur
Compiler-Direktiven, die wie der C-Präprozessor-Anweisungen aussehen. Es
findet aber keine Ersetzung statt, aber man kann auch Code-Abschitte
für verschiedene Konfigurationen ein- und ausblenden (#if .. #endif).
Die Symbole können in der Projektmappe oder im Code (#define) festgelegt
werden.
Die zweite Funktion sind pragmas, etwa um Warnungen aus- und wieder
einzuschalten (#pragma warning disable 1234), und Entwickler-definierte
Warnungen.
Die dritte und letzte Funktion ist die Hervorhebung von Code-Blöcken für
die IDE oder den Programmierer.
Alle anderen Funktionen des Präprozessors von C fehlen in C#. Beispiel:
Makros als Alternativen zu den Inline-Funktionen machen in C# keinen
Sinn, da der JIT-Compiler Hotspots automatisch erkennt
(http://blogs.msdn.com/b/ericgu/archive/2004/01/29/64644.aspx).
Die Direktiven waren ab Version 1.0 dabei. (language specification)