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)
{ ... }
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)
{ ... }
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.
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(...)
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 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.
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/
3 Stimmen
Für alle, die auf der Suche nach Eric Lipperts archivierter Blogpost ist nicht mehr auf msdn zu finden: archive.org hat alles für Sie
4 Stimmen
Eigentlich ist archive.org nicht nötig, @EricLippert hat seinen Blog hierher verlegt: ( ericlippert.com/2009/09/10/ )
1 Stimmen
@rold2007: Danke für den Link; ich verschiebe nach und nach alle alten Inhalte rüber, aber sie sind noch nicht da. Außerdem hat MSDN mein Blog-Archiv wiederhergestellt, was sehr nett von ihnen war.
0 Stimmen
@MicheldeRuiter: Der obige Link ( ericlippert.com/2009/09/10/ ) funktioniert für mich. Der Link blogs.msdn.com ist für immer defekt.