Qual é a diferença entre Console.WriteLine () e Debug.WriteLine ()?

90

Qual é a diferença entre vs ?Console.WriteLine()Debug.WriteLine()

Zolomon
fonte

Respostas:

103

Console.WriteLine grava no fluxo de saída padrão, seja na depuração ou na liberação. Debug.WriteLine grava nos ouvintes de rastreamento na coleção de Ouvintes , mas apenas quando executado na depuração. Quando o aplicativo é compilado na configuração de versão, os elementos Debug não serão compilados no código.

Conforme Debug.WriteLinegrava em todos os ouvintes de rastreamento na coleção de Ouvintes , é possível que isso possa ser gerado em mais de um lugar (janela de saída do Visual Studio, console, arquivo de log, aplicativo de terceiros que registra um ouvinte (acredito que DebugView faz isso ), etc.).

Sam Holder
fonte
7
O DebugView monitora estritamente as mensagens registradas por meio da chamada de API nativa do Windows OutputDebugString(e DebugPrint). As DefaultTraceListenergravações em OutputDebugString, é por isso que DebugView vê a saída. msdn.microsoft.com/en-us/library/…
MarkJ
40

Console.WriteLine()destina-se a programas de modo de console. Um bom recurso do processo de hospedagem do Visual Studio faz sua saída aparecer na janela Saída do Visual Studio durante a depuração de processos que não têm um console. Isso é muito útil durante a depuração, mas tome cuidado para remover esse código (ou envolvê-lo com um #ifdef DEBUG) quando estiver pronto para criar a compilação de lançamento. Caso contrário, adicionará sobrecarga desnecessária ao seu programa. Isso o torna menos do que ideal para rastreamento de depuração.

Debug.WriteLine()gera informações de rastreamento se você construir com a condição de DEBUG #defined. Que está ativado por padrão na compilação de depuração. O local onde a saída termina pode ser configurado no arquivo app.exe.config. Se esta configuração não for substituída, o .NET fornece automaticamente uma instância da classe DefaultTraceListener. Ele envia o texto Debug.WriteLine () com a função da API OutputDebugString () do Windows para o depurador. O depurador do Visual Studio faz com que isso apareça na janela Saída, assim como Console.WriteLine ().

Uma vantagem clara de Debug.WriteLine () é que ele não gera sobrecarga no build do Release, as chamadas são efetivamente removidas. No entanto, ele não suporta a formatação composta, você precisará de String.Format () para isso. Para rastreamento de depuração, a classe Debug deve ser sua escolha.

Hans Passant
fonte
18

Se o seu propósito de usar Console.WriteLine for exclusivamente para depuração, é melhor usar Debug.WriteLine .

Se você quiser mostrar uma mensagem ao seu usuário, use Console.WriteLine .

Debug.WriteLine serve apenas para depurar seu aplicativo. No modo de liberação, suas instruções de depuração serão ignoradas.

Outro uso de um aplicativo de console é testar assemblies privados. Em vez da abordagem tradicional de criar algum tipo de arnês de teste de GUI para testar a versão compilada da DLL, você pode simplesmente reconstruir a DLL como um aplicativo de console e entrada / saída de / para o console. Descobri que essa técnica é mais rápida do que gastar tempo criando um equipamento de teste de GUI.

Peter Mortensen
fonte
5
"Se você quiser mostrar uma mensagem ao seu usuário, use console.writeline." Isso pode confundir algumas pessoas porque só mostrará algo ao usuário se estiver executando em um aplicativo de console.
Matt Wilko