Was ist der Unterschied zwischen Console.WriteLine () und Debug.WriteLine ()?

90

Was ist der Unterschied zwischen vs ?Console.WriteLine()Debug.WriteLine()

Zolomon
quelle

Antworten:

102

Console.WriteLine schreibt entweder beim Debuggen oder beim Release in den Standardausgabestream. Debug.WriteLine schreibt in die Trace-Listener in der Listeners- Auflistung, jedoch nur, wenn sie im Debug ausgeführt werden. Wenn die Anwendung in der Release-Konfiguration kompiliert wird, werden die Debug-Elemente nicht in den Code kompiliert.

Beim Debug.WriteLineSchreiben an alle Trace-Listener in der Listeners- Auflistung ist es möglich, dass dies an mehreren Stellen ausgegeben wird (Visual Studio-Ausgabefenster, Konsole, Protokolldatei, Drittanbieteranwendung, die einen Listener registriert (ich glaube, DebugView tut dies) ), etc.).

Sam Holder
quelle
7
DebugView überwacht strikt Nachrichten, die über den nativen Windows-API-Aufruf OutputDebugString(und DebugPrint) protokolliert wurden . Das DefaultTraceListenerschreibt an OutputDebugString, weshalb DebugView die Ausgabe sieht. msdn.microsoft.com/en-us/library/…
MarkJ
40

Console.WriteLine()ist für Programme im Konsolenmodus gedacht. Eine nette Funktion des Visual Studio-Hosting-Prozesses lässt die Ausgabe im Visual Studio-Ausgabefenster angezeigt werden, während für Prozesse ohne Konsole debuggt wird. Dies ist beim Debuggen sehr nützlich. Beachten Sie jedoch, dass Sie diesen Code entfernen (oder mit einem #ifdef DEBUG umschließen) sollten, wenn Sie bereit sind, den Release-Build zu erstellen. Andernfalls wird Ihrem Programm unnötiger Overhead hinzugefügt. Dies macht es für die Debug-Ablaufverfolgung weniger als ideal.

Debug.WriteLine()generiert Ablaufverfolgungsinformationen, wenn Sie mit der DEBUG-Bedingung #defined erstellen. Welches ist standardmäßig im Debug-Build aktiviert. Wo die Ausgabe endet, kann in der Datei app.exe.config konfiguriert werden. Wenn diese Konfiguration nicht überschrieben wird, stellt .NET automatisch eine Instanz der DefaultTraceListener-Klasse bereit. Es sendet den Debug.WriteLine () -Text mit der Windows OutputDebugString () -API-Funktion an den Debugger. Der Visual Studio-Debugger zeigt an, dass dies genau wie Console.WriteLine () im Ausgabefenster angezeigt wird.

Ein klarer Vorteil von Debug.WriteLine () ist, dass im Release-Build kein Overhead generiert wird und die Aufrufe effektiv entfernt werden. Die zusammengesetzte Formatierung wird jedoch nicht unterstützt. Dazu benötigen Sie String.Format (). Für die Debug-Ablaufverfolgung sollte die Debug-Klasse Ihre Wahl sein.

Hans Passant
quelle
18

Wenn Sie Console.WriteLine ausschließlich zum Debuggen verwenden, verwenden Sie besser Debug.WriteLine .

Wenn Sie Ihrem Benutzer eine Nachricht anzeigen möchten, verwenden Sie Console.WriteLine .

Debug.WriteLine dient nur zum Debuggen Ihrer Anwendung. Im Release-Modus werden Ihre Debug-Anweisungen ignoriert.

Eine andere Verwendung einer Konsolenanwendung ist das Testen privater Assemblys. Anstelle des herkömmlichen Ansatzes, eine Art GUI-Testkabel zum Testen der kompilierten Version der DLL zu erstellen, können Sie die DLL einfach als Konsolenanwendung neu erstellen und von / in die Konsole eingeben / ausgeben. Ich habe festgestellt, dass diese Technik schneller ist als das Erstellen eines GUI-Testgeschirrs.

Peter Mortensen
quelle
5
"Wenn Sie Ihrem Benutzer eine Nachricht anzeigen möchten, verwenden Sie console.writeline." Dies könnte einige Leute verwirren, da es dem Benutzer nur dann etwas anzeigt, wenn es in einer Konsolenanwendung ausgeführt wird.
Matt Wilko