Até agora, todos os dados dos nossos programas foram escritos por nós, no próprio código. O programa não fazia perguntas nem ouvia respostas — era um monólogo. Nesta aula, ele aprende a dialogar. Você já sabe exibir mensagens com Console.WriteLine; agora aprenderá a ler o que o usuário digita, transformando programas de fala única em programas interativos, que perguntam, escutam e reagem. E, ao fazê-lo, encontraremos um pequeno mistério — tudo o que o usuário digita chega ao programa como texto — cuja solução completa ocupará a próxima aula, mas cujo primeiro contato faremos aqui. É o momento em que seu programa cruza a fronteira entre você e o mundo.
Duas formas de exibir: WriteLine e Write
Você já conhece Console.WriteLine, que exibe um texto e pula para a linha seguinte. Existe uma variante próxima, Console.Write (sem o "Line"), que exibe o texto mas não pula de linha — o cursor permanece logo após o texto, na mesma linha. Essa diferença é útil justamente quando vamos pedir um dado ao usuário, pois queremos que ele digite ao lado da pergunta, e não na linha de baixo:
Console.Write("Digite seu nome: "); // sem pular linha; o cursor fica ao lado
Ao rodar, o programa exibe "Digite seu nome: " e espera, com o cursor piscando logo após os dois pontos, convidando o usuário a digitar ali mesmo. Use Write para perguntas e WriteLine para mensagens que devem ocupar sua própria linha; a escolha entre os dois é uma questão de como você quer que a tela se organize.
Lendo o que o usuário digita: ReadLine
Para ler uma linha digitada pelo usuário, usamos Console.ReadLine. Essa ação faz o programa pausar e esperar que o usuário digite algo e pressione Enter; o que foi digitado é então entregue ao programa como uma string. Como esse valor lido precisa ser guardado em algum lugar para que possamos usá-lo, tipicamente atribuímos o resultado de ReadLine a uma variável:
Console.Write("Digite seu nome: ");
string nome = Console.ReadLine(); // pausa, lê o que o usuário digitar, guarda em 'nome'
Console.WriteLine("Olá, " + nome + "!");
Acompanhe o fluxo desse pequeno diálogo. O programa exibe "Digite seu nome: " e para. O usuário digita, por exemplo, "Ana", e pressiona Enter. Nesse instante, Console.ReadLine() entrega o texto "Ana", que é guardado na variável nome. A linha seguinte então usa esse valor, exibindo "Olá, Ana!". Você acabou de escrever seu primeiro programa interativo — um que se comporta de forma diferente conforme quem o usa. Rode-o e experimente digitar nomes diferentes; a cada execução, a saudação se ajusta ao que você digitou.
Vale notar a estrutura de Console.ReadLine(): diferentemente de WriteLine, que recebia um texto entre os parênteses (o que exibir), o ReadLine tem os parênteses vazios — porque ele não precisa que você lhe entregue nada; a informação que interessa é a que ele devolve, o texto digitado. Essa ideia de uma ação que devolve um valor (em vez de apenas fazer algo) é importante e a exploraremos a fundo quando estudarmos métodos; por ora, observe que o valor devolvido por ReadLine é justamente o que guardamos na variável.
O mistério: tudo que entra é texto
Agora chegamos ao ponto delicado, e é melhor encará-lo desde já. Console.ReadLine sempre devolve uma string — texto — não importa o que o usuário tenha digitado. Se o usuário digita seu nome, recebemos o texto do nome, o que é ótimo. Mas e se pedirmos a idade dele, e ele digitar "30"? Recebemos a string "30" — o texto "30", e não o número 30. E, como vimos na Aula #05, texto e número são naturezas diferentes: não se pode fazer aritmética com texto.
Observe o problema concretamente. Suponha que queiramos ler a idade e calcular a idade no ano seguinte:
Console.Write("Digite sua idade: ");
string idadeTexto = Console.ReadLine(); // recebe o TEXTO, por exemplo "30"
// A linha abaixo NÃO faz o que gostaríamos:
// Console.WriteLine(idadeTexto + 1);
Se tentássemos idadeTexto + 1, lembraríamos da aula anterior que o + entre uma string e outro valor concatena — juntaria os textos —, então "30" + 1 produziria o texto "301", e não o número 31. Pior: dependendo de como escrevêssemos, o C# poderia até recusar a operação. O ponto é claro: para calcular com o que o usuário digitou, precisamos primeiro converter aquele texto num número de verdade. Essa conversão de texto para número — e o cuidado que ela exige, porque o usuário pode digitar algo que não é um número — é um assunto tão importante que merece a aula inteira que vem a seguir. Por ora, guarde o problema bem formulado na mente: o que entra pelo teclado é texto, e texto não é número.
Compondo mensagens de saída
Enquanto a leitura de números fica para a próxima aula, podemos aproveitar o que já sabemos para produzir saídas ricas. Combinando ReadLine com a concatenação da Aula #06, montamos diálogos completos com texto:
Console.Write("Qual é o seu nome? ");
string nome = Console.ReadLine();
Console.Write("Qual é a sua cidade? ");
string cidade = Console.ReadLine();
Console.WriteLine("Prazer, " + nome + "! Que bom ter alguém de " + cidade + " por aqui.");
Este programa conduz um pequeno diálogo: pergunta o nome, pergunta a cidade, e responde com uma mensagem que costura os dois dados numa frase. É um exemplo modesto, mas contém a essência da interatividade: o programa se comporta de acordo com o que recebe. Rode-o, responda às perguntas, e veja a resposta final se adaptar às suas respostas. Note como os espaços dentro das aspas foram cuidadosamente colocados para que a frase final não saia com palavras grudadas — um detalhe pequeno, mas que faz diferença na apresentação.
O programa deixou de ser um monólogo. Ele agora exibe informação com WriteLine e Write, cuja diferença está apenas na quebra de linha, e recebe informação do usuário com ReadLine. Com essas duas pontas, um programa passa a ter uma conversa: pergunta, escuta, responde.
E ficou plantado um problema que ainda não tem solução aqui: tudo o que entra pelo teclado chega como texto, mesmo quando o usuário digita um número. Somar dois desses valores não produz a soma esperada, e sim a junção dos dígitos. Reconhecer esse comportamento é o primeiro passo para tratá-lo com as ferramentas certas.
Fontes e leituras recomendadas
- A classe Console — a referência oficial de
Write,WriteLine,ReadLinee das demais formas de interagir com o console; a base desta aula. - Console.ReadLine (referência) — os detalhes da ação que lê uma linha digitada pelo usuário.
- Console.Write (referência) — a variante que exibe sem pular de linha, útil para perguntas.
- Tutorial: entrada e saída no console — material introdutório sobre interação básica, complementar a esta aula.
- Concatenação de strings — como compor mensagens juntando texto e valores, revisto no contexto da saída.
Exercícios
Exercício 1
Escreva um programa que pergunte o nome do usuário usando Console.Write, leia a resposta com Console.ReadLine, e o cumprimente pelo nome. Explique por que usamos Write, e não WriteLine, para fazer a pergunta.
Ver resposta
✓ Resposta: Exemplo:
Console.Write("Digite seu nome: ");
string nome = Console.ReadLine();
Console.WriteLine("Olá, " + nome + "!");
Usamos Write na pergunta para que o cursor permaneça na mesma linha do texto, permitindo que o usuário digite logo ao lado de "Digite seu nome: ", o que é a experiência natural de um formulário. Com WriteLine, a digitação começaria na linha de baixo, separada da pergunta.
Exercício 2
Escreva um programa que faça três perguntas ao usuário (por exemplo, nome, cidade e comida favorita), guarde cada resposta numa variável, e ao final exiba uma frase que combine as três respostas de forma natural, cuidando dos espaços.
Ver resposta
✓ Resposta: Exemplo:
Console.Write("Nome: ");
string nome = Console.ReadLine();
Console.Write("Cidade: ");
string cidade = Console.ReadLine();
Console.Write("Comida favorita: ");
string comida = Console.ReadLine();
Console.WriteLine(nome + ", de " + cidade + ", adora " + comida + ".");
Cada resposta é lida e guardada; a frase final concatena as três com texto de ligação, com atenção aos espaços para não grudar as palavras.
Exercício 3
Explique, com suas palavras, por que Console.ReadLine() tem os parênteses vazios, enquanto Console.WriteLine("Olá") tem um texto dentro dos parênteses. O que essa diferença revela sobre o que cada ação precisa e o que cada uma produz?
Ver resposta
✓ Resposta: Console.ReadLine() tem os parênteses vazios porque essa ação não precisa que lhe entreguemos nenhuma informação — sua função é ler o que o usuário digita e devolver esse texto; o que interessa é o valor que ela produz. Já Console.WriteLine("Olá") precisa receber, entre os parênteses, o texto a ser exibido, pois sua função é justamente mostrar aquilo que lhe entregamos. A diferença revela que WriteLine recebe uma informação para agir sobre ela, enquanto ReadLine devolve uma informação como resultado.
Exercício 4
Escreva um programa que peça a idade do usuário, leia-a, e exiba a mensagem "Você digitou: " + idade. Ao rodar, digite um número e observe o resultado. Depois, explique por que, se você tentasse idade + 1 esperando um número, não obteria o resultado aritmético desejado.
Ver resposta
✓ Resposta: Exemplo:
Console.Write("Sua idade: ");
string idade = Console.ReadLine();
Console.WriteLine("Você digitou: " + idade);
Digitando um número, ele aparece corretamente na mensagem — mas apenas porque está sendo tratado como texto concatenado. Se você tentasse idade + 1 esperando um resultado aritmético, não o obteria, porque idade é uma string: o + entre uma string e o número faria concatenação (juntaria os textos, produzindo algo como "301" se a idade fosse "30"), e não a soma numérica desejada. Falta converter o texto em número.
Exercício 5
Sem escrever a conversão (que veremos na próxima aula): descreva com suas palavras o "mistério" apresentado nesta aula. Por que o fato de ReadLine sempre devolver texto é um problema quando queremos trabalhar com números, e o que precisaremos fazer para resolvê-lo?
Ver resposta
✓ Resposta: O mistério é que Console.ReadLine sempre devolve uma string (texto), qualquer que seja o que o usuário digite. Isso é um problema quando queremos trabalhar com números porque texto e número são naturezas diferentes: não se pode fazer aritmética com texto, e o operador +, aplicado a strings, junta em vez de somar. Assim, se o usuário digita "30" e queremos calcular com esse valor, recebemos o texto "30", não o número 30. Para resolver, precisaremos converter o texto digitado num número de verdade — transformação que a próxima aula ensinará, com o cuidado necessário para o caso de o usuário digitar algo que não seja um número.