В чем разница между Console.WriteLine () и Debug.WriteLine ()?

Ответы:

106

Console.WriteLine записывает в стандартный поток вывода либо при отладке, либо при выпуске. Debug.WriteLine записывает в прослушиватели трассировки в коллекции Listeners , но только при выполнении отладки. Когда приложение компилируется в конфигурации выпуска, элементы Debug не компилируются в код.

Поскольку Debug.WriteLineзапись выполняется во все прослушиватели трассировки в коллекции Listeners , возможно, что это может быть выведено более чем в одном месте (окно вывода Visual Studio, консоль, файл журнала, стороннее приложение, которое регистрирует прослушиватель (я считаю, что DebugView делает это ), так далее.).

Сэм Холдер
источник
7
Строго DebugView отслеживает сообщения, регистрируемые через собственный вызов Windows API OutputDebugStringDebugPrint). DefaultTraceListenerПишет OutputDebugString, поэтому DebugView видит выход. msdn.microsoft.com/en-us/library/…
MarkJ
41

Console.WriteLine()предназначен для программ консольного режима. Хорошая особенность процесса размещения Visual Studio - вывод его вывода в окне вывода Visual Studio во время отладки для процессов, у которых нет консоли. Это очень полезно при отладке, но помните, что вам следует удалить этот код (или обернуть его #ifdef DEBUG), когда вы будете готовы создать сборку Release. В противном случае это добавит ненужных накладных расходов вашей программе. Это делает его менее идеальным для трассировки отладки.

Debug.WriteLine()генерирует информацию трассировки, если вы выполняете сборку с условным условием DEBUG #defined. Что по умолчанию включено в сборке отладки. Где заканчивается вывод, можно настроить в файле app.exe.config. Если эта конфигурация не переопределена, .NET автоматически предоставляет экземпляр класса DefaultTraceListener. Он отправляет текст Debug.WriteLine () с функцией API Windows OutputDebugString () в отладчик. Отладчик Visual Studio отображает это в окне вывода, как Console.WriteLine ().

Явным преимуществом Debug.WriteLine () является то, что он не создает накладных расходов в сборке Release, вызовы эффективно удаляются. Однако он не поддерживает составное форматирование, для этого вам понадобится String.Format (). Для трассировки отладки вы должны выбрать класс Debug.

Ганс Пассан
источник
18

Если вы используете Console.WriteLine исключительно для отладки, вам лучше использовать Debug.WriteLine .

Если вы хотите показать сообщение своему пользователю (в консольном приложении), вы должны использовать Console.WriteLine .

Debug.WriteLine предназначен только для отладки вашего приложения. В режиме выпуска ваши отладочные операторы будут проигнорированы.

Другое использование консольного приложения - тестирование частных сборок. Вместо традиционного подхода к созданию своего рода тестового набора GUI для тестирования скомпилированной версии DLL вы можете просто перестроить DLL как консольное приложение и вводить / выводить с / на консоль. Я обнаружил, что этот метод работает быстрее, чем тратить время на создание тестовой среды GUI.

Rohwedder
источник
6
«Если вы хотите показать сообщение своему пользователю, вы должны использовать console.writeline». Это может сбить с толку некоторых людей, потому что пользователю будет отображаться что-то только при выполнении в консольном приложении.
Мэтт Вилко