Dyrektywy preprocesora dają instrukcje dla kompilatora, aby przetworzył informacje zanim dojdzie do rzeczywistego procesu kompilacji.

Wszystkie dyrektywy rozpoczynają się od znaku # i jedynie znaki spacji mogą pojawić się w linii deklaracji dyrektywy. Dyrektywy nie są traktowane jak deklaracje, dlatego taka linia nie musi kończyć się znakiem średnika.

Kompilator języka C# nie ma odrębnego preprocesora, jednakże dyrektywy przetwarzane są w taki sposób jak by taki preprocesor istniał. W C# używane są do warunkowej kompilacji. Dyrektywa preprocesora musi być jedyną instrukcją w linii.

Dyrektywy preprocesora

Poniżej lista dyrektyw dostępnych w języku C#:
Dyrektywa Znaczenie
#define definiuje ciąg znaków, tj. symbol
#undef pozwala na oddefiniowanie symbolu
#if pozwala na testowanie symbolu lub sprawdzenie czy jest to wartość logiczna prawdziwa lub fałszywa
#else pozwala na utworzenie związku wraz z dyrektywą #if
#elif pozwala na tworzenie bardziej złożonych testów symbolu
#endif określa koniec warunkowej dyrektywy
#line pozwala na zmianę numeru linii kompilatora oraz opcjonalnie na zmianę nazwy pliku wyjściowego z błędami i ostrzeżeniami
#error pozwala na wygenerowanie błędu w określonej lokalizacji w kodzie
#warning pozwala na wygenerowanie ostrzeżenia w określonej lokalizacji w kodzie
#region pozwala na zdefinowanie bloku kodu, który można zwinąć/rozwinąć w trakcie korzystania z Visual Studio
#endregion onaczna koniec bloku rozpoczętego dyrektywą #region
Dyrektywa #define

Dyrektywa ta definiuje ciąg znaków. #define pozwala na utworzenie symbolu, który może zostać przekazany do dyrektywy #if. Symbol taki ma wartość true a jego definicja to:
#define symbol
Przykład:
#define MOJAZMIENNA
using System;
namespace Dyrektywy
{
    class Program
    {
        static void Main(string[] args)
        {
#if(MOJAZMIENNA)
            Console.WriteLine("Zmienna jest zdefiniowana");
#else
            Console.WriteLine("Zmienna nie jest zdefiniowana");
#endif
            Console.ReadKey();
        }
    }
}

Dyrektywy warunkowe

Dyrektywa #if może zostać użyta do utworzenia dyrektyw warunkowych. Są one przydatne to testowania symboli oraz sprawdzania czy wartość logiczna takiego symbolu jest prawdziwa. Jeżeli wartość logiczna jest prawdziwa zostanie wykonany cały kod pomiędzy #if a następną dyrektywą.
Składnia:
#if (warunek)
Warunki, które mogą być sprawdzane w dyrektywie warunkowej:
  • == (równość);
  • != (nierówność);
  • && (i);
  • || (lub).
Przykład użycia:
#define DEBUG
#define VERSION1
using System;
namespace Dyrektywy
{
    class Program
    {
        static void Main(string[] args)
        {
#if (DEBUG && !VERSION1)
            Console.WriteLine("DEBUG jest zdefiniowane);
#elif (!DEBUG && VERSION1)
            Console.WriteLine("VERSION1 jest zdefiniowane);
#elif (DEBUG && VERSION1)
            Console.WriteLine("DEBUG oraz VERSION1 są zdefiniowane");
#else
            Console.WriteLine("DEBUG oraz VERSION1 nie są zdefiniowane");
#endif
            Console.ReadKey();
            // Wynik działania programu
            //DEBUG oraz VERSION1 sa zdefiniowane
        }
    }
}