J'ai du code qui accède à une API sur le Web. L'un des paramètres de l'API me permet de leur faire savoir que je teste.
Je voudrais définir ce paramètre dans mon code uniquement lorsque je teste. Actuellement, je commente simplement le code lorsque je crée une version.
Existe-t-il un moyen automatique de procéder basé sur la configuration de construction?
Vous pouvez utiliser l'un des éléments suivants—
Conditional
L'attribut Conditional
indique aux compilateurs qu'un appel de méthode ou un attribut doit être ignoré sauf si un symbole de compilation conditionnel spécifié est défini.
Exemple de code:
[Conditional("DEBUG")]
static void Method() { }
#if
Lorsque le compilateur C # rencontre une directive #if
preprocessor , suivie d'une directive #endif, il compile le code entre les directives uniquement si le symbole spécifié est défini. Contrairement à C et C++, vous ne pouvez pas affecter de valeur numérique à un symbole. L'instruction #if en C # est booléenne et teste uniquement si le symbole a été défini ou non.
Exemple de code:
#if DEBUG
static int testCounter = 0;
#endif
Debug.Write
Debug.Write
(et Debug.WriteLine
) écrit des informations sur le débogage dans les écouteurs de trace dans la collection Auditeurs .
Voir aussi Debug.WriteIf
et Debug.WriteLineIf
.
Exemple de code:
Debug.Write("Something to write in Output window.");
Méfiez-vous de la directive #if
car elle peut générer des situations inattendues dans Release build. Par exemple, voir:
string sth = null;
#if DEBUG
sth = "oh, hi!";
#endif
Console.WriteLine(sth);
Dans ce cas, la construction non-Debug imprimera un message vierge. Mais, cela peut potentiellement générer NullReferenceException
dans un cas différent.
Il existe également un outil, DebugView , qui permet de capturer des informations de débogage à partir d’applications externes.
oui, envelopper le code
#if DEBUG
// do debug only stuff
#else
// do non DEBUG stuff
#endif
Google pour "Symboles de compilation C #"
Visual Studio définit automatiquement DEBUG
lorsque vous vous trouvez dans la configuration de débogage. Vous pouvez définir les symboles de votre choix (consultez les propriétés de votre projet, l'onglet Construction). Attention, abuser des directives du préprocesseur est une mauvaise idée, cela peut conduire à un code très difficile à lire/maintenir.
J'ai eu le même problème et la solution que j'ai choisie consiste à utiliser:
if (System.Diagnostics.Debugger.IsAttached)
{
// Code here
}
Cela signifie que techniquement, en production, vous pouvez attacher un débogueur et exécuter ce morceau de code.
En plus des directives #if #endif, vous pouvez également utiliser des attributs conditionnels. Si vous marquez une méthode avec l'attribut
[Conditional("Debug")]
Il ne sera compilé et exécuté que lorsque votre application sera créée en mode débogage. Comme indiqué dans le commentaire ci-dessous, ceux-ci ne fonctionnent que lorsque la méthode a un type de retour vide.
public int Method ()
{
#if DEBUG
// do something
#endif
}
Voici un autre article avec un résultat similaire: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/
Une meilleure explication peut être vue à: http://msdn.Microsoft.com/en-us/library/4y6tbswk.aspx
// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !MYTEST)
Console.WriteLine("DEBUG is defined");
#Elif (!DEBUG && MYTEST)
Console.WriteLine("MYTEST is defined");
#Elif (DEBUG && MYTEST)
Console.WriteLine("DEBUG and MYTEST are defined");
#else
Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
}
}
Ce qui suit est sûr à utiliser:
var isDebug = false;
#if DEBUG
isDebug = System.Diagnostics.Debugger.IsAttached;
#endif
if (isDebug) {
// Do something
}
Cela fonctionne dans asp.net:
if (System.Web.HttpContext.Current.IsDebuggingEnabled)
//send email to developer;
else
//send email to customer;
de Rick Strahl @ Detecting-ASPNET-Debug-mode