#if DEBUG

Poniższy kawałek kodu jest celowo wklejony jako obrazek. Ważne jest tutaj, wyszarzenie instrukcji znajdujących się po warunku #else. Oznacza to, że teraz jesteśmy w trybie DEBUG i preprocesor wytnie to co jest dla RELEASE i kompilator tego nawet nie zobaczy.

Nie będzie to nawet brane pod uwagę, gdy wykonamy Rename klasy HeroClass. Następnie po jakimś czasie (nie wszędzie builduje się pod wszystkie konfiguracje przy każdym checkin’ie) ktoś będzie chciał skompilować kod w trybie RELEASE i przywita go taki komunikat:

Jeszcze w innym wypadku może się okazać, że dana klasa już nie istnieje. Częściowym rozwiązaniem jest następujący kod:

    bool isDebug = false;
#if DEBUG
    isDebug = true;
#endif

    object data;
    if (isDebug)
    {
        data = HeroClass.GetTestingData();
    }
    else
    {
        data = HeroClass.GetRealData();
    }

Można też zrobić to w podobny sposób, ale bez korzystania z #if DEBUG. Skorzystamy z atrybutu Conditional:

    
    void Setup()
    {
        bool isDebug = false;
        GetDebug(ref isDebug);

        object data;
        if (isDebug)
        {
            data = HeroClass.GetTestingData();
        }
        else
        {
            data = HeroClass.GetRealData();
        }
    }

    [Conditional("DEBUG")]
    void GetDebug(ref bool isDebug)
    {
        isDebug = true;
    }

Nie wiem, czy któreś z tych podejść jest ogólnie lepsze. W pierwszym szybciej widać co się dzieje, nie tworzymy pomocniczej funkcji GetDebug(ref bool isDebug).

Reklamy
Ten wpis został opublikowany w kategorii Uncategorized i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

4 odpowiedzi na „#if DEBUG

  1. Pingback: dotnetomaniak.pl

  2. Nie wiem co chcesz uzyskać, ale może przyda ci się ‚System.Diagnostics.Debugger.IsAttached’.

    • Z tego też często korzystam. Masz rację, rozwiązałoby to powyższy problem. Chodziło mi tutaj raczej o ukazanie sposobu jak poradzić sobie z jakimikolwiek #if’ami. Zamiast DEBUG może być też jakaś zdefiniowana przez nas stała, która działa tylko w naszym projekcie.

  3. Pingback: AutoMapper – jak używać | Show me the code

Możliwość komentowania jest wyłączona.