"Tylko Debuguj" kod, który powinien działać tylko po włączeniu""

Chciałbym dodać trochę kodu C#" debug only", który działa tylko wtedy, gdy osoba debugująca go zażąda. W C++ robiłem coś podobnego do tego:

void foo()
{   
  // ...
#ifdef DEBUG
  static bool s_bDoDebugOnlyCode = false;
  if (s_bDoDebugOnlyCode)
  {
      // Debug only code here gets executed when the person debugging 
      // manually sets the bool above to true.  It then stays for the rest
      // of the session until they set it to false.
  }
#endif
 // ...
}

Nie mogę zrobić dokładnie tego samego w C#, ponieważ nie ma statyki lokalnej.

Pytanie: jaki jest najlepszy sposób na osiągnięcie tego w C#?

  1. Czy powinienem używać statycznego pola klasy prywatnej z dyrektywami preprocesora C #(#if/ # endif DEBUG)?
  2. Czy powinienem użyć atrybutu warunkowego (do ( nie otoczone dyrektywami preprocesora C# if/#endif DEBUG?).
  3. Coś jeszcze?
Author: Matt Smith, 2011-02-22

5 answers

Zmienna instancji prawdopodobnie byłaby sposobem na zrobienie tego, co chcesz. Można uczynić go statycznym, aby zachowywał tę samą wartość przez cały okres życia programu (lub wątku w zależności od modelu pamięci statycznej), lub zmienić go w zwykłą instancję var, aby kontrolować ją przez cały okres życia instancji obiektu. Jeśli ta instancja jest singletonem, zachowają się tak samo.

#if DEBUG
private /*static*/ bool s_bDoDebugOnlyCode = false;
#endif

void foo()
{   
  // ...
#if DEBUG
  if (s_bDoDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }
#endif
 // ...
}

Aby być kompletnym, pragmas (dyrektywy preprocesora) są uważane za trochę kludge do użycia do sterowania przepływem programu. . NET ma wbudowaną odpowiedź na połowę tego problemu, używając atrybutu "Conditional".

private /*static*/ bool doDebugOnlyCode = false; 
[Conditional("DEBUG")]
void foo()
{   
  // ...    
  if (doDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }    
  // ...
}
Bez pragmatów, dużo czystsze. Minusem jest to, że warunkowe mogą być stosowane tylko do metod, więc będziesz musiał radzić sobie ze zmienną logiczną, która nie robi nic w kompilacji release. Ponieważ zmienna istnieje wyłącznie po to, aby być przełączana z hosta vs execution, a w kompilacji release jej wartość nie ma znaczenia, jest całkiem nieszkodliwa.
 108
Author: KeithS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 15:46:07

To czego szukasz to

[ConditionalAttribute("DEBUG")]

Atrybut.

Jeśli na przykład napiszesz metodę jak:

[ConditionalAttribute("DEBUG")]
public static void MyLovelyDebugInfoMethod(string message)
{
    Console.WriteLine("This message was brought to you by your debugger : ");
    Console.WriteLine(message);
}

Każde wywołanie tej metody wewnątrz własnego kodu będzie wykonywane tylko w trybie debugowania. Jeśli zbudujesz swój projekt w trybie release, nawet wywołanie "MyLovelyDebugInfoMethod" zostanie zignorowane i wyrzucone z Twojego pliku binarnego.

Oh I jeszcze jedno, jeśli próbujesz ustalić, czy Twój kod jest obecnie debugowany podczas wykonywania moment, możliwe jest również, aby sprawdzić, czy bieżący proces jest zaczepiony przez JIT. Ale to wszystko razem inna sprawa. Post a comment if this is what you2re trying to do.

 55
Author: gokkor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 13:35:39

Możesz tego spróbować, jeśli potrzebujesz kodu do uruchomienia tylko wtedy, gdy masz debugger dołączony do procesu.

if (Debugger.IsAttached)
{
     // do some stuff here
}
 17
Author: Wes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 19:31:58

Jeśli chcesz wiedzieć, czy debugowanie, wszędzie w programie. Użyj tego.

Zadeklaruj zmienną globalną.

bool isDebug=false;

Tworzenie funkcji do sprawdzania trybu debugowania

[ConditionalAttribute("DEBUG")]
    public static void isDebugging()
    {
        isDebug = true;
    }

W metodzie initialize wywołujemy funkcję

isDebugging();
Teraz w całym programie. Możesz sprawdzić debugowanie i wykonać operacje. Mam nadzieję, że to pomoże!
 3
Author: Mohamed Alikhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 06:40:39

Myślę, że warto wspomnieć, że [ConditionalAttribute] znajduje się w przestrzeni nazw System.Diagnostics;. Trochę się potknąłem jak dostałem:

Error 2 The type or namespace name 'ConditionalAttribute' could not be found (are you missing a using directive or an assembly reference?)

Po pierwszym użyciu (myślałem, że będzie w System).

 3
Author: XyberICE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 17:54:40