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.
- 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/falsee caracteres, e por que sai3,5com vírgula. - Juntar textos com
+, e a armadilha do"Total: " + 2 + 3. - Uma primeira olhada no
$"…{ }…"e nos escapes\ne\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étodo | Na máquina de escrever | Tradução do nome |
|---|---|---|
Console.Write("…") | Digita o texto e fica na mesma linha | write = "escrever" |
Console.WriteLine("…") | Digita o texto e puxa a alavanca: a próxima escrita começa na linha de baixo | write 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.
Write("Arroz")escreveArroze fica ali.Write(", feijão")continua:Arroz, feijão. O espaço depois da vírgula está dentro das aspas; oWritenão põe espaço nenhum por conta própria.Write(", café"):Arroz, feijão, café.WriteLine(".")escreve o ponto e, agora sim, termina a linha.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.
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ódigo | Na tela | Por quê |
|---|---|---|
29 | 29 | Um número inteiro, sem aspas. |
3.5 | 3,5 | No 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 + 5 | 15 | Sem aspas, é uma conta: o C# calcula primeiro e mostra o resultado. |
10 / 4 | 2 | Divisão entre inteiros dá um inteiro: a parte depois da vírgula é jogada fora. Surpresa comum, explicada em Operadores Aritméticos. |
10.0 / 4 | 2,5 | Com um número decimal na conta, o resultado é decimal. |
true | True | Um valor "verdadeiro" (bool). Repare: no código é true, minúsculo; na tela sai True, com maiúscula. Aula char e bool. |
'A' | A | Um caractere (char), entre aspas simples. |
12.50m | 12,50 | Um 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 um3. Resultado:Total: 23. - "Total: " + (2 + 3)
- O conserto: os parênteses mandam fazer a soma antes.
2 + 3vira5, e só depois é emendado. - 2 + 3 + " itens"
- Aqui a conta vem primeiro, da esquerda:
2 + 3dá5, e então5 + " 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".
| Escape | Vira |
|---|---|
\n | Uma quebra de linha (new line), no meio do texto |
\t | Uma 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ção | Use |
|---|---|
| Uma linha completa de texto | Console.WriteLine("…") |
| Uma linha em branco | Console.WriteLine() |
| Uma pergunta, com a resposta na mesma linha | Console.Write("Nome: ") |
| Uma linha montada aos pedaços | vários Write e um WriteLine no fim |
| Uma frase com valores no meio | Console.WriteLine($"… {valor} …") |
| A última escrita do programa | WriteLine, para o prompt não grudar |
| Um aviso de problema | Console.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.
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}".
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
| Escrita | Mostra |
|---|---|
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:
2. Linha em branco
Complete a instrução que escreve uma linha em branco:
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 umWriteLine.- 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).trueaparece comoTrue. +entre texto e número emenda, da esquerda para a direita:"Total: " + 2 + 3dáTotal: 23. Use parênteses ou, melhor,$"Total: {2 + 3}".- Dentro das aspas:
\nquebra a linha,\ttabula,\"é uma aspa. Console.Error.WriteLineescreve na saída de erro, separada da saída padrão.- Erros comuns:
Writeln/writeline(CS0117),printe texto sem aspas (CS0103),Write()vazio (CS1501) e a vírgula no lugar do+, que compila e esconde o valor.