110 votes

C# "Debug uniquement" code qui devrait fonctionner uniquement lorsque "activé"

Je voudrais ajouter un peu de C# "debug uniquement" code qui ne fonctionne que si la personne de débogage de la demande. En C++, j'ai utilisé pour faire quelque chose de similaire à la suivante:

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
 // ...
}

Je ne peux pas faire exactement la même chose en C# depuis il n'y a pas de locaux de la statique.

Question: Quelle est la meilleure façon d'accomplir ceci en C#?

  1. Dois-je utiliser une classe privée de champ statique avec C# les directives de préprocesseur (#si/#endif DEBUG)?
  2. Dois-je utiliser l'attribut Conditionnel (pour garder le code), puis d'un cours privé de champ statique (pas entouré par C# les directives de préprocesseur #si/#endif DEBUG?).
  3. Quelque chose d'autre?

177voto

KeithS Points 36130

Une variable d'instance serait peut-être le moyen de faire ce que vous voulez. Vous pourriez faire de l'électricité statique à persister la même valeur pour la durée du programme (ou du fil en fonction de votre mémoire statique du modèle), ou en faire un ordinaire de l'instance var pour le contrôle sur la durée de vie d'une instance d'objet. Si cette instance est un singleton, ils se comportent de la même manière.

#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
 // ...
}

75voto

gokkor Points 229

Ce que vous cherchez est

[ConditionalAttribute("DEBUG")]

attribut.

Si vous avez par exemple écrire une méthode comme :

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

tout appel de cette méthode à l'intérieur de votre propre code ne sera exécuté en mode de débogage. Si vous construisez votre projet en mode release, même appel à la "MyLovelyDebugInfoMethod" sera ignoré et sous-évaluées de votre binaire.

Oh et encore une chose si vous essayez de déterminer si oui ou non votre code est actuellement en cours de débogage au moment de l'exécution, il est aussi possible de vérifier si le processus actuel est accroché par une équipe commune d'enquête. Mais c'est tous ensemble un autre cas. Poster un commentaire si c'est ce que you2re d'essayer de faire.

34voto

Wes Points 1

Vous pourriez essayer si vous avez seulement besoin du code à exécuter lorsque vous avez un débogueur au processus.

if (Debugger.IsAttached)
{
     // do some stuff here
}

5voto

XyberICE Points 39

Je pense qu'il peut être utile de mentionner que, [ConditionalAttribute] est le System.Diagnostics; d'espace de noms. Je suis tombé un peu quand j'ai eu:

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

après l'avoir utilisé pour la première fois (je pensais qu'elle aurait été en System).

5voto

Mohamed Alikhan Points 183

Si vous voulez savoir si si le débogage, partout dans le programme. L'utilisation de ce.

Déclarer une variable globale.

bool isDebug=false;

Créer de la fonction de vérification de la mode debug

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

Dans la méthode initialize appel de la fonction

isDebugging();

Maintenant, dans l'ensemble du programme. Vous pouvez vérifier pour le débogage et de faire les opérations. Espérons que cette Aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X