C# Olá, Mundo
Chegou a hora de escrever o seu primeiro programa em C#. Ele é pequeno: só mostra a frase Olá, mundo! na tela. Mas, para chegar até ela, você vai fazer o caminho que todo programa faz: escrever o código num arquivo e pedir ao dotnet para compilar e rodar. No C# moderno, o programa inteiro cabe numa linha, e nesta aula você entende cada pedacinho dela, sem pular nenhum símbolo.
- Criar a pasta e o arquivo
ola.csno editornano. - O que faz cada parte de
Console.WriteLine("Olá, mundo!");: oConsole, o ponto, oWriteLine, os parênteses, as aspas e o;. - Rodar o programa com
dotnet run ola.cs. - Mostrar várias linhas, uma instrução depois da outra.
- Por que
Consoleeconsolenão são a mesma coisa. - Ver o código de saída com
echo $?. - A forma antiga, com
class Programestatic void Main, que você vai ver em muitos tutoriais. - Os primeiros erros que todo mundo comete, com a mensagem real.
Todos os comandos desta aula foram executados na máquina fictícia da Ana (usuária ana, computador notebook), com o .NET SDK 10.0.112 do Ubuntu 26.04, numa pasta chamada ~/cs. As saídas foram copiadas da tela, sem mudar nada. Se você ainda não instalou o .NET, volte para Instalar no Linux (ou Windows e macOS). Se ainda não quer instalar, você pode fazer quase tudo no editor do guia, que compila e roda C# de verdade no navegador (O Editor do Guia).
A ideia: a receita e o bolo
Pense numa receita de bolo escrita num papel. O papel não é o bolo: alguém precisa ler a receita e fazer o bolo. Em C# é igual:
| Na cozinha | Em C# | Nesta aula |
|---|---|---|
| A receita no papel | O código-fonte: um arquivo de texto que você escreve | ola.cs |
| Ler a receita e conferir se está tudo certo | Compilar: o compilador confere e traduz o código | dotnet run ola.cs faz os dois |
| Fazer o bolo | Rodar o programa | |
| O bolo na mesa | O que aparece na tela | Olá, mundo! |
O comando dotnet run faz as duas etapas de uma vez: primeiro compila (se houver um erro, para aí e mostra a mensagem), depois roda. A aula .NET: SDK, Runtime e CLR mostra o que acontece por dentro, e a próxima aula, Rodar com dotnet run, mostra tudo o que esse comando sabe fazer. Aqui você só precisa de dois passos: escrever e rodar.
1. Criar a pasta e o arquivo
Comece criando uma pasta só para os seus programas, para eles não se misturarem com fotos e documentos. No terminal:
$ mkdir cs « cria a pasta "cs" dentro da sua pasta pessoal $ cd cs « entra nela
Os dois comandos não mostram nada quando dão certo: o terminal só volta a mostrar o prompt, agora com ~/cs no fim. (mkdir e cd são comandos do terminal, não do C#. Eles são explicados no Guia Bash.)
Agora crie o arquivo. Qualquer editor de texto serve (o VS Code, o editor de textos do sistema… veja Editores e IDEs). Aqui vamos usar o nano, que roda dentro do próprio terminal e já vem no Ubuntu:
$ nano ola.cs « abre o nano com um arquivo novo chamado ola.cs
O terminal vira um editor. No alto aparece GNU nano 8.7.1 e o nome ola.cs; embaixo, [ Novo arquivo ] e uma lista de atalhos, como ^O Gravar e ^X Sair. O ^ quer dizer a tecla Ctrl. Digite o programa, que tem uma linha só:
Console.WriteLine("Olá, mundo!");
- Digite a linha exatamente como está, com as letras maiúsculas no mesmo lugar (
C,WeL). - Aperte Ctrl + O (
^O Gravar). Embaixo apareceEscrever para o arquivo: ola.cs. - Aperte Enter para confirmar o nome. O nano responde
[ Escrita 1 linha ]. - Aperte Ctrl + X (
^X Sair) para voltar ao terminal.
Três cuidados ao salvar:
- A extensão é
.cs, de C sharp. Ela diz aodotnete ao editor que o arquivo é código C#. - Sem espaços e sem acentos no nome:
ola.cs, e nãoolá mundo.cs. Funciona com espaços, mas você teria de usar aspas em todo comando. - Digite, não copie e cole, pelo menos desta vez. Digitar faz você reparar em cada símbolo, e em C# os símbolos importam.
Para conferir que o arquivo está na pasta certa e com o conteúdo certo, use ls (lista os arquivos) e cat (mostra o conteúdo):
$ ls
ola.cs
$ cat ola.cs
Console.WriteLine("Olá, mundo!");
2. O programa, palavra por palavra
Uma linha só, mas cada símbolo tem uma função. Leia com calma; não precisa decorar nada agora, porque você vai escrever essa linha tantas vezes que ela vai grudar sozinha.
Console.WriteLine("Olá, mundo!");
- Console
- O "console" é a tela de texto onde o programa conversa com você: o terminal. Em C#,
Consoleé uma classe pronta, que vem com o .NET e reúne tudo o que se pode fazer com essa tela: escrever, ler o que a pessoa digita, limpar, mudar a cor. Ela começa com C maiúsculo, e isso importa. - .
- O ponto quer dizer "de dentro de":
Console.WriteLineé "oWriteLineque mora dentro doConsole". Você vai ver esse ponto o tempo todo em C#:Math.Sqrt,nome.Length,File.ReadAllText. - WriteLine
- "Escrever linha" (write = escrever, line = linha): escreve o texto e, no fim, pula para a linha de baixo. É um método, uma ação que se pode pedir a uma classe. Também com maiúsculas:
WeL. - ( )
- Os parênteses depois do nome chamam o método: "
WriteLine, faça o seu trabalho com isto aqui dentro". O que vai entre eles se chama argumento. - "Olá, mundo!"
- O texto, entre aspas duplas. As aspas dizem ao compilador "isto é texto para mostrar, não é código", e não aparecem na tela. Um texto entre aspas se chama string (aula Strings). Dentro das aspas vale tudo: acentos, espaços, a vírgula, a exclamação.
- ;
- O ponto e vírgula termina a instrução, como o ponto final de uma frase. Esquecê-lo é o erro número um de quem começa, e você vai vê-lo no fim desta aula.
E onde está o resto do programa?
Se você já viu um programa em C# num livro ou num vídeo, deve estar estranhando: cadê o using System;, o class Program e o static void Main? Desde o C# 9, eles não são mais obrigatórios. Duas regras deixam o programa curto:
- Instruções de nível superior (top-level statements): você escreve as instruções direto no arquivo, e o compilador cria sozinho, por baixo, a "moldura" que o programa precisa. O programa começa na primeira linha e vai até a última.
usingautomáticos C# 10: oConsolemora num "endereço" chamadoSystem. Antes, era preciso escreverusing System;no topo; hoje, o .NET já faz isso por você.
A forma antiga continua funcionando e aparece na seção 6. A aula Program.cs e o Main mostra que as duas formas são o mesmo programa.
3. Rodar o programa
Com o arquivo salvo, peça ao dotnet para compilar e rodar:
$ dotnet run ola.cs Olá, mundo!
Pronto: esse é o seu primeiro programa em C# funcionando. As aspas não apareceram, e o prompt voltou na linha de baixo, porque o WriteLine pula a linha no fim.
- dotnet
- O comando do .NET, que você instalou.
- run
- "Rodar": compila e roda.
- ola.cs
- O arquivo a rodar.
Duas coisas que você pode estranhar:
- A primeira vez demora uns segundos. O
dotnetprecisa preparar tudo e compilar. Da segunda vez em diante, se o arquivo não mudou, ele reaproveita o que já compilou e responde quase na hora. Na primeiríssima vez depois de instalar o .NET, aparece também uma mensagem de boas-vindas (aula Instalar no Linux). - Nenhum arquivo novo apareceu na pasta. O
dotnet runguarda o programa compilado numa pasta escondida, longe da sua (a aula Rodar com dotnet run mostra onde). Na sua pasta, continua só oola.cs.
Agora é a sua vez. O editor abaixo compila e roda C# de verdade no navegador (a primeira vez demora alguns segundos, porque ele baixa o compilador e o .NET). Ele faz o mesmo que o dotnet run quando você clica em Rodar.
Missão: rode o programa como está. Depois troque mundo pelo nome Ana, de modo que a saída seja Olá, Ana!, e rode de novo. Mexa só no que está entre as aspas.
Console.WriteLine("Olá, mundo!");
Console.WriteLine("Olá, Ana!");
4. Mostrar mais de uma linha
Um programa pode ter quantas instruções você quiser. Elas rodam uma depois da outra, de cima para baixo, cada uma terminada com ;:
Console.WriteLine("Olá! Eu sou a Ana.");
Console.WriteLine("Estou aprendendo C#.");
Console.WriteLine("Este é o meu primeiro programa.");
$ dotnet run tres.cs Olá! Eu sou a Ana. Estou aprendendo C#. Este é o meu primeiro programa.
Cada WriteLine escreve uma linha e pula para a próxima. A ordem na tela é a ordem no arquivo: o computador não pula nem troca nenhuma instrução de lugar. (Mais tarde, com if e while, você vai aprender a decidir e a repetir.)
Missão: acrescente uma quarta linha, no fim, que mostre Até a próxima!. Copie o jeito das linhas de cima.
Console.WriteLine("Olá! Eu sou a Ana.");
Console.WriteLine("Estou aprendendo C#.");
Console.WriteLine("Este é o meu primeiro programa.");
Console.WriteLine("Olá! Eu sou a Ana.");
Console.WriteLine("Estou aprendendo C#.");
Console.WriteLine("Este é o meu primeiro programa.");
Console.WriteLine("Até a próxima!");
Write e WriteLine
O Console tem um irmão do WriteLine: o Write, que escreve sem pular a linha. E um WriteLine() com os parênteses vazios só pula uma linha:
Console.Write("Olá, ");
Console.Write("mundo!");
Console.WriteLine();
System.Console.WriteLine("Com o nome completo: System.Console");
$ dotnet run write.cs Olá, mundo! « os dois Write ficaram na mesma linha Com o nome completo: System.Console
A última linha mostra outra coisa: System.Console é o nome completo do Console, com o "endereço" System na frente. Funciona igual, só é mais comprido; por isso ninguém escreve assim. A aula Saída (Console.WriteLine) mostra tudo o que o Write e o WriteLine sabem fazer, e a aula Namespaces e using explica o System.
5. Maiúsculas e minúsculas
O C# diferencia letras maiúsculas de minúsculas: Console, console e CONSOLE são três nomes diferentes, e só o primeiro existe. O mesmo vale para WriteLine: Writeline, com o l minúsculo, não existe. É o tipo de erro que mais confunde no começo, porque, para nós, "é a mesma palavra". Os dois erros estão em Quando dá errado, com as mensagens reais.
O costume do C# é escrever os nomes de classes e métodos com a primeira letra de cada palavra em maiúscula: Console, WriteLine, ReadLine. Isso se chama PascalCase (aula Nomes e Convenções). Sabendo a regra, fica fácil adivinhar como se escreve.
6. O código de saída
Todo programa, quando termina, entrega um número ao sistema: o código de saída. 0 quer dizer "terminei sem problemas"; qualquer outro número quer dizer "algo deu errado". No terminal, o código de saída do último programa fica guardado em $?, e o echo o mostra:
$ dotnet run ola.cs Olá, mundo! $ echo $? 0 « 0: deu tudo certo
O programa termina sozinho com 0 quando chega ao fim do arquivo. Para escolher outro número, termine com return e o número:
Console.WriteLine("Até logo!");
return 7;
$ dotnet run ate.cs Até logo! $ echo $? 7 « o 7 do return chegou ao terminal
Para que serve isso? Scripts e outros programas usam o código de saída para saber se o seu programa deu certo. O próprio dotnet run faz isso: quando a compilação falha, ele sai com o código 1 (você vai ver em "Quando dá errado"). O editor do guia mostra o código de saída embaixo da saída do programa. A aula Program.cs e o Main conta mais sobre o return.
Missão: faça o programa mostrar Até logo! e terminar com o código de saída 7. Troque o texto e acrescente a linha return 7; no fim. Confira o número que o editor mostra.
Console.WriteLine("Olá, mundo!");
Console.WriteLine("Até logo!");
return 7;
7. A forma antiga: class Program e static void Main
Até o C# 8, todo programa precisava de uma moldura de nove linhas. Você vai encontrá-la em muitos livros, cursos e respostas na internet, e no projeto que o Visual Studio cria se você marcar a opção "não usar instruções de nível superior". Este é o mesmo Olá, mundo, na forma antiga:
using System;
class Program
{
static void Main()
{
Console.WriteLine("Olá, mundo!");
}
}
$ dotnet run antigo.cs Olá, mundo! « o mesmo resultado
A linha que faz alguma coisa é a mesma de antes, o Console.WriteLine. O resto é a moldura: using System; traz o endereço do Console; class Program cria uma classe chamada Program; static void Main() é o método principal, por onde o programa começa; as chaves { } marcam onde cada parte começa e termina. Hoje, o compilador escreve essa moldura por você, escondida. Cada pedaço tem aula própria: Program.cs e o Main, Classes e Objetos, static e Métodos.
Formas de escrever o Olá, mundo
| Forma | Onde aparece |
|---|---|
Console.WriteLine("Olá, mundo!"); | A forma deste guia e do dotnet new console desde o .NET 6. C# 9 |
System.Console.WriteLine("Olá, mundo!"); | Com o nome completo. Funciona em qualquer versão, mas é comprida. |
class Program { static void Main() { … } } | A forma antiga, de livros, cursos e projetos de antes de 2021. Funciona no C# 14. |
Console.Write("Olá, mundo!"); | Escreve sem pular a linha no fim: o prompt do terminal gruda no texto. |
Qual usar? A primeira. Ela é a mais clara, e é a que o próprio .NET usa nos modelos novos. Quando encontrar a forma antiga, lembre: o miolo é o mesmo.
Quando dá errado
Errar faz parte. Um erro de compilação não estraga nada: o compilador só se recusa a rodar o programa até você consertar. Repare que todas as mensagens têm o mesmo formato: o arquivo, a (linha,coluna), a palavra error, um código CSxxxx e a explicação. O código é igual em qualquer língua: procurando "CS1002" na internet, você acha a explicação.
error CS1002: ; esperado
Console.WriteLine("Olá, mundo!")
$ dotnet run semponto.cs /home/ana/cs/semponto.cs(1,33): error CS1002: ; esperado Ocorreu uma falha no build. Corrija os erros de build e execute novamente. $ echo $? 1 « o dotnet avisa que falhou: código 1
O que significa: faltou o ponto e vírgula. O compilador chegou à coluna 33, logo depois do ), e esperava um ;. A última linha, "ocorreu uma falha no build", quer dizer que a compilação (o build) falhou e o programa não rodou. Em inglês, o erro diz ; expected.
Como consertar: coloque o ; no fim da linha e rode de novo.
error CS0103: O nome "console" não existe no contexto atual
console.WriteLine("Olá, mundo!");
$ dotnet run minuscula.cs /home/ana/cs/minuscula.cs(1,1): error CS0103: O nome "console" não existe no contexto atual Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
O que significa: o compilador procurou alguma coisa chamada console, com c minúsculo, e não achou ("não existe no contexto atual" = "não conheço esse nome aqui"). Para ele, console e Console são nomes diferentes. Em inglês: The name 'console' does not exist in the current context.
Como consertar: Console, com C maiúsculo.
error CS0117: "Console" não contém uma definição para "Writeline"
Console.Writeline("Olá, mundo!");
$ dotnet run writeline.cs /home/ana/cs/writeline.cs(1,9): error CS0117: "Console" não contém uma definição para "Writeline" Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
O que significa: agora o Console está certo, mas dentro dele não existe nada chamado Writeline, com l minúsculo. A coluna 9 é onde começa o Writeline, logo depois do ponto.
Como consertar: WriteLine, com L maiúsculo. Num editor de código, digite Console. e escolha o nome na lista: assim ele nunca sai errado.
error CS1010: Newline em constante
Console.WriteLine("Olá, mundo!);
$ dotnet run aspas.cs /home/ana/cs/aspas.cs(1,19): error CS1010: Newline em constante /home/ana/cs/aspas.cs(1,33): error CS1026: ) esperado /home/ana/cs/aspas.cs(1,33): error CS1002: ; esperado Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
O que significa: faltou fechar as aspas. O texto começou na coluna 19 e chegou ao fim da linha (newline, a "quebra de linha") ainda aberto, como se o ); fosse parte da frase. Por isso vieram mais dois erros: o compilador não achou nem o ) nem o ;, porque eles ficaram "dentro" do texto.
Como consertar: feche as aspas depois do !: "Olá, mundo!". Com vários erros, conserte sempre o primeiro: muitas vezes, os outros somem junto.
Não foi possível localizar um projeto para executar.
$ dotnet run ola.cs Não foi possível localizar um projeto para executar. Verifique se existe um projeto em /home/ana/vazio ou passe o caminho para o projeto usando --project.
O que significa: não existe nenhum ola.cs na pasta atual (aqui, a Ana estava na pasta ~/vazio). Ou você está em outra pasta, ou o nome está diferente (Ola.cs, ola.cs.txt). Como não achou o arquivo, o dotnet procurou um projeto (aula Projetos) e também não achou. A mensagem fala de projeto, mas o problema é o arquivo.
Como consertar: rode ls para ver o que há na pasta. Se o ola.cs não aparece, entre na pasta certa com cd ~/cs. A tecla Tab completa nomes de arquivo no terminal e evita esse erro.
O que significa: o arquivo não foi salvo. O dotnet run lê o arquivo que está no disco, não o que está na tela do editor.
Como consertar: salve (no nano, Ctrl+O e Enter; nos outros editores, Ctrl+S) e rode de novo.
Referência rápida
| Escrita | O que faz |
|---|---|
Console.WriteLine("texto"); | Mostra o texto e pula para a linha de baixo |
Console.Write("texto"); | Mostra o texto sem pular a linha |
Console.WriteLine(); | Só pula uma linha |
"…" | Um texto (string) |
; | Termina uma instrução |
return 7; | Termina o programa com o código de saída 7 |
nano ola.cs | Abre (ou cria) o arquivo no editor nano; Ctrl+O grava, Ctrl+X sai |
dotnet run ola.cs | Compila e roda o arquivo ola.cs |
echo $? | Mostra o código de saída do último programa |
Exercícios
1. Escrever uma linha
Complete a instrução que mostra Oi! e pula a linha:
2. O fim da instrução
Que símbolo termina toda instrução em C#?
3. Rodar
O arquivo jogo.cs está na pasta atual. Que comando o compila e roda?
4. O código de saída
Que comando mostra o código de saída do último programa que rodou?
5. O compilador respondeu O nome "console" não existe no contexto atual. O que está errado?
6. Qual é a diferença entre Console.Write e Console.WriteLine?
7. Um tutorial mostra o Olá, mundo com class Program e static void Main. Ele está errado?
8. Com três erros na tela, qual você conserta primeiro?
Missão final: o cartão de visita
Missão: escreva um programa completo que mostre o cartão de visita da Ana em três linhas:
Ana Souza Programadora C# Recife - PE
Use um Console.WriteLine para cada linha, com as maiúsculas no lugar e o ; no fim. Se o compilador reclamar, leia a linha e a coluna da mensagem.
// escreva o programa aqui (esta linha é um comentário: o compilador ignora)
Console.WriteLine("Ana Souza");
Console.WriteLine("Programadora C#");
Console.WriteLine("Recife - PE");
Resumo
- Um programa em C# pode ter uma linha só:
Console.WriteLine("Olá, mundo!");. O arquivo termina em.cs. Consoleé a tela de texto; o ponto quer dizer "de dentro de";WriteLineescreve e pula a linha; o texto vai entre aspas; o;termina a instrução.dotnet run ola.cscompila e roda. A primeira vez demora uns segundos; depois, é quase na hora.- As instruções rodam de cima para baixo.
Writeescreve sem pular a linha. - O C# diferencia maiúsculas:
consoledáCS0103,WritelinedáCS0117. Sem;,CS1002; sem fechar aspas,CS1010. echo $?mostra o código de saída: 0 se deu certo, 1 se a compilação falhou, ou o número doreturn.- A forma antiga, com
class Programestatic void Main, é o mesmo programa com a moldura à mostra. - Próximo passo: Rodar com dotnet run, tudo o que esse comando sabe fazer.