C# Saída (Console.WriteLine)

Um programa que não mostra nada é como uma calculadora sem visor: pode até fazer a conta, mas ninguém fica sabendo o resultado. Desde a primeira aula você usa o Console.WriteLine para escrever no terminal. Nesta aula você conhece de perto ele e o seu irmão, o Console.Write: como pular linha (ou não), como mostrar números, como juntar textos e números numa frase só, e as armadilhas que fazem um programa mostrar 23 quando você esperava 5.

Você vai aprender
  • O Console.WriteLine, com texto e sem nada (a linha em branco).
  • O Console.Write, que escreve sem pular linha, e como os dois se combinam.
  • Como o C# mostra números, contas, true/false e caracteres, e por que sai 3,5 com vírgula.
  • Juntar textos com +, e a armadilha do "Total: " + 2 + 3.
  • Uma primeira olhada no $"…{ }…" e nos escapes \n e \t.
  • A saída de erro, Console.Error.WriteLine.
  • Os erros mais comuns: nome errado, aspas esquecidas, vírgula no lugar do +.

Os programas desta aula foram rodados na máquina fictícia da Ana com o .NET 10 SDK (C# 14), na pasta ~/cs/saida, com dotnet run arquivo.cs. A máquina está em português do Brasil, e isso aparece nos números. As saídas foram copiadas da tela.


A ideia: o letreiro e a máquina de escrever

Pense numa máquina de escrever antiga. Você digita as letras, e o papel anda para a esquerda. Quando a linha acaba, você puxa a alavanca, e o papel desce uma linha e volta para o começo.

O terminal funciona assim. O Console (a "máquina") tem duas teclas principais:

MétodoNa máquina de escreverTradução do nome
Console.Write("…")Digita o texto e fica na mesma linhawrite = "escrever"
Console.WriteLine("…")Digita o texto e puxa a alavanca: a próxima escrita começa na linha de baixowrite line = "escrever linha"

1. Console.WriteLine

Cada WriteLine escreve o que estiver entre os parênteses e termina a linha. Sem nada entre os parênteses, ele só termina a linha: o resultado é uma linha em branco.

Console.WriteLine("Lojinha da Ana");
Console.WriteLine();
Console.WriteLine("Aberta de segunda a sábado.");
$ dotnet run writeline.cs
Lojinha da Ana

Aberta de segunda a sábado.
Console
A classe do .NET que representa o terminal (o "console"). Tudo o que se faz com o terminal começa com Console..
.WriteLine
O método "escrever linha": escreve e pula para a linha de baixo. Escrito exatamente assim, com W e L maiúsculos (aula Sintaxe).
("Lojinha da Ana")
O que vai ser escrito. Entre aspas, é um texto (uma string, aula Strings) e sai exatamente como está, acentos e espaços incluídos.
Console.WriteLine();
Sem nada entre os parênteses: escreve só a quebra de linha. Os parênteses continuam obrigatórios.

2. Console.Write: escrever sem pular linha

O Write escreve e deixa o "cursor" parado logo depois do texto. O próximo Write ou WriteLine continua na mesma linha:

Console.Write("Arroz");
Console.Write(", feijão");
Console.Write(", café");
Console.WriteLine(".");
Console.WriteLine("Fim da lista.");
$ dotnet run write.cs
Arroz, feijão, café.
Fim da lista.
  1. Write("Arroz") escreve Arroz e fica ali.
  2. Write(", feijão") continua: Arroz, feijão. O espaço depois da vírgula está dentro das aspas; o Write não põe espaço nenhum por conta própria.
  3. Write(", café"): Arroz, feijão, café.
  4. WriteLine(".") escreve o ponto e, agora sim, termina a linha.
  5. WriteLine("Fim da lista.") começa na linha de baixo.

A regra: o WriteLine pula a linha depois do texto, nunca antes. Quem escolhe onde a linha acaba é sempre o último a escrever nela.

O último Write do programa

Se o programa termina com um Write, a linha fica sem fim, e o terminal escreve o prompt dele grudado no seu texto:

Console.Write("Tchau!");
$ dotnet run semfim.cs
Tchau!ana@notebook:~/cs/saida$          « o prompt colou no Tchau!

Não é um erro do programa, mas fica feio. Por isso a última escrita de um programa é quase sempre um WriteLine.

Para que serve o Write, então?

Para montar uma linha aos pedaços, como no write.cs, e principalmente para fazer perguntas: Console.Write("Seu nome: "); deixa o cursor esperando na mesma linha, logo depois dos dois-pontos, para a pessoa digitar a resposta com o Console.ReadLine() (aula Ler do Teclado).

Missão: o programa escreve cada item numa linha. Faça a lista sair numa linha só: Compras: arroz, feijão, café.. Troque os WriteLine que devem continuar na mesma linha por Write e acerte as vírgulas e os espaços dentro das aspas.

Console.WriteLine("Compras: ");
Console.WriteLine("arroz");
Console.WriteLine("feijão");
Console.WriteLine("café");
Console.Write("Compras: ");
Console.Write("arroz, ");
Console.Write("feijão, ");
Console.WriteLine("café.");

3. Números, contas e outros valores

O WriteLine não escreve só textos. Ele aceita números, contas e outros valores, e transforma cada um em texto para mostrar:

Console.WriteLine(29);
Console.WriteLine(3.5);
Console.WriteLine(10 + 5);
Console.WriteLine(10 / 4);
Console.WriteLine(10.0 / 4);
Console.WriteLine(true);
Console.WriteLine('A');
Console.WriteLine(12.50m);
$ dotnet run numeros.cs
29
3,5
15
2
2,5
True
A
12,50
No códigoNa telaPor quê
2929Um número inteiro, sem aspas.
3.53,5No código, a casa decimal é sempre com ponto. Na tela, o .NET usa o costume do país do computador, e no Brasil é vírgula. (Num computador em inglês, sairia 3.5. A aula Cultura explica como escolher.)
10 + 515Sem aspas, é uma conta: o C# calcula primeiro e mostra o resultado.
10 / 42Divisão entre inteiros dá um inteiro: a parte depois da vírgula é jogada fora. Surpresa comum, explicada em Operadores Aritméticos.
10.0 / 42,5Com um número decimal na conta, o resultado é decimal.
trueTrueUm valor "verdadeiro" (bool). Repare: no código é true, minúsculo; na tela sai True, com maiúscula. Aula char e bool.
'A'AUm caractere (char), entre aspas simples.
12.50m12,50Um decimal, o tipo do dinheiro (o m marca o tipo). Ele guarda o zero do fim. Aula float, double e decimal.

Você não precisa entender todos os tipos agora; eles têm aulas próprias, a partir de Tipos de Dados. O importante é: com aspas, o C# mostra o texto como está; sem aspas, ele calcula o valor e mostra o resultado.


4. Juntar texto e número com +

Para escrever uma frase com um número no meio, junte as partes com +. Entre dois textos (ou entre um texto e um número), o + não soma: ele emenda. Isso se chama concatenação:

Console.WriteLine("Idade: " + 29);
Console.WriteLine("2" + "3");
Console.WriteLine(2 + 3);
Console.WriteLine("Total: " + 2 + 3);
Console.WriteLine("Total: " + (2 + 3));
Console.WriteLine(2 + 3 + " itens");
$ dotnet run juntar.cs
Idade: 29
23
5
Total: 23                « opa!
Total: 5
5 itens
"Idade: " + 29
Texto + número: o número vira texto e é emendado. O espaço depois dos dois-pontos está dentro das aspas.
"2" + "3"
Dois textos: emenda, e dá o texto 23.
2 + 3
Dois números: soma, e dá 5.
"Total: " + 2 + 3
A armadilha. O C# faz as contas da esquerda para a direita: primeiro "Total: " + 2, que dá o texto "Total: 2"; depois "Total: 2" + 3, que emenda mais um 3. Resultado: Total: 23.
"Total: " + (2 + 3)
O conserto: os parênteses mandam fazer a soma antes. 2 + 3 vira 5, e só depois é emendado.
2 + 3 + " itens"
Aqui a conta vem primeiro, da esquerda: 2 + 3 dá 5, e então 5 + " itens" emenda.

Missão: a Ana comprou 2 cadernos e 3 canetas e quer ver Total: 5 itens, mas o programa mostra Total: 23 itens. Conserte com parênteses, sem tirar o 2 + 3 do código.

Console.WriteLine("Total: " + 2 + 3 + " itens");
Console.WriteLine("Total: " + (2 + 3) + " itens");

Um jeito mais fácil: $"…"

Emendar muitas partes com + cansa e dá margem a erro. O C# tem um jeito mais limpo, a interpolação: um $ antes das aspas, e os valores entre chaves { } no meio do texto. O que está entre chaves é calculado:

Console.WriteLine($"A Ana tem {29} anos e {10 + 5} maçãs.");
$ dotnet run interp.cs
A Ana tem 29 anos e 15 maçãs.

Com variáveis (a próxima parte do guia, a partir de Variáveis), essa forma fica ainda mais útil: $"Olá, {nome}!". Ela é a preferida no C# moderno e tem aula própria: Interpolação. Você ainda vai encontrar, em código antigo, a forma com números entre chaves, Console.WriteLine("{0} tem {1} anos.", "Ana", 29);, que mostra Ana tem 29 anos.; o {0} é trocado pelo primeiro valor depois do texto, o {1} pelo segundo.


5. Quebras de linha e tabulação dentro do texto

Dentro das aspas, a barra invertida \ começa uma sequência de escape: um código para um caractere que não dá para digitar direto. As três mais usadas:

Console.WriteLine("Arroz\nFeijão");
Console.WriteLine("Item\tPreço");
Console.WriteLine("Ela disse \"oi\".");
$ dotnet run escapes.cs
Arroz
Feijão
Item	Preço
Ela disse "oi".
EscapeVira
\nUma quebra de linha (new line), no meio do texto
\tUma tabulação (tab), um espaço largo que alinha colunas
\"Uma aspa dentro do texto, sem fechá-lo

A lista completa, e os textos de várias linhas com """, estão em Escapes e Strings Literais. Para começar, prefira um WriteLine por linha: é mais fácil de ler que um texto cheio de \n.


6. A saída de erro: Console.Error

Todo programa tem, na verdade, duas saídas: a saída padrão (standard output), para os resultados, e a saída de erro (standard error), para avisos e mensagens de problema. O Console.WriteLine escreve na primeira; o Console.Error.WriteLine, na segunda:

Console.WriteLine("Calculando...");
Console.Error.WriteLine("Atenção: estoque baixo!");
Console.WriteLine("Pronto.");
$ dotnet run erro.cs
Calculando...
Atenção: estoque baixo!
Pronto.
$ dotnet run erro.cs 2>/dev/null
Calculando...
Pronto.                  « a saída de erro foi descartada
$ dotnet run erro.cs >/dev/null
Atenção: estoque baixo!  « só sobrou a saída de erro

Na tela, as duas aparecem misturadas e parecem iguais. A diferença surge quando a saída é redirecionada: o 2>/dev/null do terminal joga fora só a saída de erro, e o >/dev/null joga fora só a padrão. Assim, quem guarda os resultados de um programa num arquivo não recebe os avisos misturados. (Os redirecionamentos são do terminal, não do C#; no editor do guia, as duas saídas aparecem juntas, na ordem.) Por enquanto, use o Console.WriteLine para tudo; o Console.Error volta a aparecer com as Exceções.


Write ou WriteLine: qual usar

SituaçãoUse
Uma linha completa de textoConsole.WriteLine("…")
Uma linha em brancoConsole.WriteLine()
Uma pergunta, com a resposta na mesma linhaConsole.Write("Nome: ")
Uma linha montada aos pedaçosvários Write e um WriteLine no fim
Uma frase com valores no meioConsole.WriteLine($"… {valor} …")
A última escrita do programaWriteLine, para o prompt não grudar
Um aviso de problemaConsole.Error.WriteLine("…")

Quando dá errado

error CS0117: "Console" não contém uma definição para "Writeln"

O que significa: o nome do método está errado. Os enganos mais comuns são Writeln (de outras linguagens), Writeline e writeline:

$ dotnet run writeln.cs
/home/ana/cs/saida/writeln.cs(1,9): error CS0117: "Console" não contém uma definição para "Writeln"

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.

Como consertar: WriteLine, com W e L maiúsculos, ou Write.

error CS0103: O nome "print" não existe no contexto atual

O que significa: quem vem do Python escreve print("Olá");. Em C#, não existe um print solto: tudo o que escreve no terminal está dentro do Console.

Como consertar: Console.WriteLine("Olá");.

error CS0103: O nome "Olá" não existe no contexto atual

O que significa: faltaram as aspas. Sem elas, o C# acha que Olá é o nome de alguma coisa (uma variável, por exemplo) e não acha nada com esse nome:

$ dotnet run semaspas.cs                « Console.WriteLine(Olá);
/home/ana/cs/saida/semaspas.cs(1,19): error CS0103: O nome "Olá" não existe no contexto atual

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.

Como consertar: texto vai entre aspas duplas: Console.WriteLine("Olá");.

error CS1501: Nenhuma sobrecarga para o método "Write" leva 0 argumentos

O que significa: Console.Write();, vazio. O WriteLine() vazio existe (escreve uma linha em branco), mas o Write() vazio não faria nada, e por isso não existe. "Sobrecarga" é cada uma das versões de um método (aula Sobrecarga); "argumento" é o que vai entre os parênteses. Em inglês: No overload for method 'Write' takes 0 arguments.

Como consertar: ponha o que escrever, ou troque por Console.WriteLine(); se queria uma linha em branco.

error CS1003: Erro de sintaxe, "," esperado

O que significa: dois textos lado a lado, sem nada entre eles: Console.WriteLine("Arroz" "Feijão");.

$ dotnet run dois.cs
/home/ana/cs/saida/dois.cs(1,27): error CS1003: Erro de sintaxe, "," esperado

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.

Como consertar: o compilador sugere uma vírgula, mas o que você quer é emendar: use + ("Arroz" + "Feijão"). E veja o próximo cenário: com a vírgula, compila, mas não faz o que você quer.

Compila, mas o número não aparece: Console.WriteLine("Idade:", 29);

O que significa: com uma vírgula, o 29 não é emendado: ele vira um valor extra para o {0} da forma antiga (seção 4). Como o texto não tem {0}, o valor é ignorado, sem erro e sem aviso:

$ dotnet run virgula.cs
Idade:                   « cadê o 29?
Ana tem 29 anos.

A segunda linha do virgula.cs é Console.WriteLine("{0} tem {1} anos.", "Ana", 29);: com os {0} e {1}, a vírgula funciona.

Como consertar: use + ("Idade: " + 29) ou, melhor, a interpolação: $"Idade: {29}".

Aparece 23 no lugar de 5

O que significa: uma conta depois de um texto, com +: "Total: " + 2 + 3 emenda o 2 e depois o 3 (seção 4).

Como consertar: parênteses em volta da conta, "Total: " + (2 + 3), ou interpolação, $"Total: {2 + 3}".


Referência rápida

EscritaMostra
Console.WriteLine("Olá");Olá e pula a linha
Console.WriteLine();Uma linha em branco
Console.Write("Olá");Olá, sem pular a linha
Console.WriteLine(10 + 5);15
Console.WriteLine(3.5);3,5 (computador em pt-BR)
Console.WriteLine("Idade: " + 29);Idade: 29
Console.WriteLine("Total: " + (2 + 3));Total: 5
Console.WriteLine($"Total: {2 + 3}");Total: 5
Console.WriteLine("{0} e {1}", "A", "B");A e B (forma antiga)
"…\n…" / "…\t…" / "…\"…"Quebra de linha / tabulação / aspas
Console.Error.WriteLine("…");Escreve na saída de erro

Exercícios

1. Sem pular linha

Complete o método que escreve sem pular a linha:

Console.("Nome: ");

2. Linha em branco

Complete a instrução que escreve uma linha em branco:

Console.WriteLine

3. A conta

O que aparece na tela com Console.WriteLine(7 + 3);?

4. O que mostra Console.WriteLine("7" + "3");?

5. Quantas linhas aparecem? Console.Write("A"); Console.Write("B"); Console.WriteLine("C"); Console.WriteLine("D");

6. Num computador em português do Brasil, o que mostra Console.WriteLine(2.5);?

7. O que mostra Console.WriteLine("Pontos: " + 4 + 1);?

Missão final: o cupom da lojinha

Missão: monte o cupom da lojinha da Ana. O começo já está pronto. Depois do título, faça uma linha em branco com Console.WriteLine(). Em cada linha de produto, use Console.Write para o nome e Console.WriteLine para o preço. No total, deixe o C# fazer a conta: 12.50m + 3.20m. A saída deve ser:

Cupom da Lojinha
================

Caderno: 12,50
Caneta: 3,20
Total: 15,70
Console.WriteLine("Cupom da Lojinha");
Console.WriteLine("================");
// linha em branco

Console.Write("Caderno: ");
Console.WriteLine(12.50m);
// a caneta custa 3.20m

// o total: deixe o C# somar
Console.WriteLine("Cupom da Lojinha");
Console.WriteLine("================");
Console.WriteLine();

Console.Write("Caderno: ");
Console.WriteLine(12.50m);
Console.Write("Caneta: ");
Console.WriteLine(3.20m);

Console.Write("Total: ");
Console.WriteLine(12.50m + 3.20m);

Repare que o preço sai com vírgula (12,50), mas no código é escrito com ponto (12.50m). E o C# acertou a soma do dinheiro sem nenhum erro de arredondamento, porque o tipo decimal foi feito para isso.


Resumo

  • Console.WriteLine(…) escreve e pula a linha depois; Console.WriteLine() faz uma linha em branco.
  • Console.Write(…) escreve e fica na mesma linha. Ótimo para perguntas e linhas montadas aos pedaços. Termine o programa com um WriteLine.
  • Com aspas, o texto sai como está; sem aspas, o C# calcula. No código o decimal é com ponto (3.5); na tela, num computador em pt-BR, sai com vírgula (3,5). true aparece como True.
  • + entre texto e número emenda, da esquerda para a direita: "Total: " + 2 + 3 dá Total: 23. Use parênteses ou, melhor, $"Total: {2 + 3}".
  • Dentro das aspas: \n quebra a linha, \t tabula, \" é uma aspa.
  • Console.Error.WriteLine escreve na saída de erro, separada da saída padrão.
  • Erros comuns: Writeln/writeline (CS0117), print e texto sem aspas (CS0103), Write() vazio (CS1501) e a vírgula no lugar do +, que compila e esconde o valor.