504 Stimmen

#if DEBUG vs. Conditional("DEBUG")

Was ist bei einem großen Projekt besser zu verwenden und warum?

#if DEBUG
    public void SetPrivateValue(int value)
    { ... }
#endif

o

[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }

20 Stimmen

Siehe blogs.msdn.com/b/ericlippert/archive/2009/09/10/ für einige Gedanken zu dieser Frage.

2 Stimmen

Können Sie auch dies verwenden: if (Debugger.IsAttached) {...}

1 Stimmen

Hinweis für Unity-Entwickler: DEBUG bedeutet im Editor oder in Entwicklungs-Builds. forum.unity.com/threads/

5voto

Kennet Belenky Punkte 2715

Nehmen wir an, Ihr Code hatte auch eine #else Anweisung, die eine Null-Stub-Funktion definiert und damit einen der Punkte von Jon Skeet aufgreift. Es gibt einen zweiten wichtigen Unterschied zwischen den beiden.

Angenommen, die #if DEBUG o Conditional Funktion existiert in einer DLL, auf die Ihr Hauptprojekt verweist. Die Verwendung der #if wird die Auswertung der Bedingung im Hinblick auf die Kompilierungseinstellungen der Bibliothek durchgeführt. Die Verwendung der Conditional Attribut wird die Auswertung der Bedingung unter Berücksichtigung der Kompilierungseinstellungen des Aufrufers durchgeführt.

3voto

Ich habe eine SOAP WebService-Erweiterung zur Protokollierung des Netzwerkverkehrs mit einem benutzerdefinierten [TraceExtension] . Ich verwende dies nur für Debuggen baut und auslässt Freigabe baut. Verwenden Sie die #if DEBUG zum Einpacken der [TraceExtension] Attribut und entfernt es somit aus Freigabe baut.

#if DEBUG
[TraceExtension]
#endif
[System.Web.Service.Protocols.SoapDocumentMethodAttribute( ... )]
[ more attributes ...]
public DatabaseResponse[] GetDatabaseResponse( ...) 
{
    object[] results = this.Invoke("GetDatabaseResponse",new object[] {
          ... parmeters}};
}

#if DEBUG
[TraceExtension]
#endif
public System.IAsyncResult BeginGetDatabaseResponse(...)

#if DEBUG
[TraceExtension]
#endif
public DatabaseResponse[] EndGetDatabaseResponse(...)

-1voto

Yashwant Shukla Punkte 29

Normalerweise braucht man sie in Program.cs, wo man entscheiden will, ob Debug- oder Non-Debug-Code ausgeführt werden soll, und das auch noch meist in Windows-Diensten. Ich habe also ein schreibgeschütztes Feld IsDebugMode erstellt und seinen Wert im statischen Konstruktor wie unten gezeigt festgelegt.

static class Program
{

    #region Private variable
    static readonly bool IsDebugMode = false;
    #endregion Private variable

    #region Constrcutors
    static Program()
    {
 #if DEBUG
        IsDebugMode = true;
 #endif
    }
    #endregion

    #region Main

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {

        if (IsDebugMode)
        {
            MyService myService = new MyService(args);
            myService.OnDebug();             
        }
        else
        {
            ServiceBase[] services = new ServiceBase[] { new MyService (args) };
            services.Run(args);
        }
    }

    #endregion Main        
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X