C# O Editor do Guia
Em toda aula há caixas Experimente: um pequeno editor de código com um botão Rodar. Elas não são uma imitação: cada clique compila de verdade o seu código com o compilador C# oficial, o mesmo que o comando dotnet usa, e roda o programa no .NET 10, tudo dentro do navegador. Nesta aula você vai conhecer cada parte da caixa, entender o que aparece no terminal dela, digitar a entrada do programa, usar as abas e as missões, e saber em que o editor é diferente do dotnet instalado no seu computador.
- As partes da caixa: abas, editor, Argumentos, Rodar, terminal, Restaurar e Ver solução.
- O que acontece na primeira vez que você clica em Rodar (o download do compilador).
- Como ler os erros e avisos do compilador na caixa.
- Como o programa recebe o que você digita (
Console.ReadLine), os argumentos e os arquivos das abas. - Como funcionam as missões.
- O que funciona igual e o que é diferente no editor e no seu computador.
A ideia: um laboratório portátil
Na escola, o laboratório de ciências tem tudo pronto: você chega, faz o experimento e vai embora. O editor do guia é assim. O compilador fica guardado dentro da página, e o programa roda num "computador de mentirinha" que só existe enquanto a aba está aberta, com a pasta da Ana (/home/ana/cs). Nada do que você fizer ali toca no seu computador. Um programa que não termina não trava nada: o botão ■ Parar o interrompe (veja Parar um programa).
Por baixo, são duas peças, as mesmas que você instala com o .NET SDK (veja .NET: SDK, Runtime e CLR):
- o Roslyn, o compilador do C#: ele lê o seu código, mostra os erros e avisos e gera o programa (um arquivo
.dll); - o runtime do .NET 10, que roda esse programa. No navegador, ele funciona em WebAssembly, um formato de programa que os navegadores executam quase tão rápido quanto um programa comum.
O compilador do editor é o mesmo do dotnet 10.0.112 que a Ana usa no Ubuntu, com as mesmas opções do dotnet run arquivo.cs: C# 14, referências anuláveis ligadas (Nullable), os using automáticos (System, System.Collections.Generic, System.IO, System.Linq…) e as mensagens em português.
As partes da caixa
Rode esta caixa e acompanhe a explicação abaixo dela:
Console.WriteLine("Olá, mundo!");
Console.WriteLine($"2 + 3 = {2 + 3}");
Console.WriteLine(3.5);
- Aba
- O nome do arquivo que você está editando, como
Program.cs. Algumas caixas têm várias abas (veja Várias abas). - Restaurar
- Volta ao código original da aula, apagando as suas mudanças. Use sem medo: o original nunca se perde.
- Editor
- Clique e digite. Os números à esquerda são os números das linhas, os mesmos que as mensagens de erro citam.
- Argumentos
- Palavras que o programa recebe em
args, como no terminal (veja Argumentos). Quase sempre fica vazio. - ▶ Rodar
- Compila e roda. Enquanto o programa roda, o botão vira ■ Parar.
- Terminal
- Aparece depois de rodar, com o título
Terminal — ana@notebook: ~/cs: o comando, as mensagens do compilador, a saída do programa e o código de saída.
Depois de rodar, o terminal da caixa mostra:
ana@notebook:~/cs$ dotnet run Program.cs Olá, mundo! 2 + 3 = 5 3,5 [código de saída: 0]
É o que a Ana veria no terminal dela com dotnet run Program.cs (a aula Rodar com dotnet run explica esse comando). Repare no 3,5 com vírgula: o editor usa a cultura pt-BR, como o computador da Ana (a aula Cultura mostra como mudar). O [código de saída: 0] é o número que o programa devolve ao terminar: 0 quer dizer "terminou bem". No terminal de verdade ele fica escondido, e você o vê com echo $?; o editor mostra sempre.
A primeira vez: o download do compilador
Na primeira vez que você clica em Rodar, o navegador baixa o compilador e o .NET: cerca de 17 MB. Aparece uma barra com a mensagem Baixando o compilador C# e o .NET (≈ 17 MB, só na primeira vez)… e a porcentagem, depois Preparando o compilador… (alguns segundos). Depois disso:
- o navegador guarda tudo: nas outras caixas, nas outras aulas e nas próximas visitas não há download;
- cada compilação leva uma fração de segundo (a primeira de cada página, um pouco mais);
- se a internet cair no meio do download, aparece
Não consegui carregar o compilador: …seguido de "Confira a internet e clique em Rodar de novo".
Se você usa o celular com plano de dados, prefira o Wi-Fi na primeira vez.
Atalhos do editor
| Tecla | O que faz |
|---|---|
| Ctrl+Enter (Mac: Cmd+Enter) | Roda o código, sem tirar a mão do teclado. |
| Tab | Insere o recuo (4 espaços). Com várias linhas selecionadas, recua todas. |
| Shift+Tab | Tira um nível de recuo. |
| Enter | Pula a linha mantendo o recuo; depois de {, ( ou [, recua mais um nível. Um } sozinho na linha volta um nível. |
| Esc | Sai do editor (para quem navega pelo teclado: depois, Tab vai para o próximo botão). |
Erros e avisos do compilador
Quando o compilador reclama, as mensagens aparecem no terminal da caixa e o programa não roda (não existe programa para rodar). A caixa abaixo tem um erro:
Missão: rode e leia a mensagem: ela diz a linha e a coluna do problema. Conserte (um número não tem aspas) e rode de novo.
int idade = "29";
Console.WriteLine($"Idade: {idade}");
int idade = 29;
Console.WriteLine($"Idade: {idade}");
ana@notebook:~/cs$ dotnet run erro.cs /home/ana/cs/erro.cs(1,13): error CS0029: Não é possível converter implicitamente tipo "string" em "int" Ocorreu uma falha no build. Corrija os erros de build e execute novamente. [código de saída: 1]
A mensagem diz: no arquivo /home/ana/cs/erro.cs, linha 1, coluna 13, um error ("erro") de código CS0029: não dá para guardar um texto (string) numa variável de número inteiro (int). A última linha avisa que o "build" (a compilação) falhou, e o [código de saída: 1] diz que deu errado: nada foi rodado. A aula Lendo Erros do Compilador ensina a ler essas mensagens.
CS0029 é o mesmo em qualquer língua. Para pesquisar na internet, use o código ou a mensagem em inglês (Cannot implicitly convert type 'string' to 'int').Avisos (warning) são diferentes: o programa compila e roda, mas o compilador desconfia de algo. O aviso aparece antes da saída:
ana@notebook:~/cs$ dotnet run Program.cs /home/ana/cs/Program.cs(1,5): warning CS0168: A variável "y" está declarada, mas nunca é usada 1,5 [código de saída: 0]
A variável y foi criada e nunca usada: não é erro, mas costuma ser esquecimento. A aula Avisos do Compilador mostra os mais comuns.
A entrada: o programa pergunta, você responde
Quando um programa lê o teclado com Console.ReadLine() (aula Ler do Teclado), aparece um campo para você digitar, dentro do próprio terminal, logo depois da pergunta. Digite e tecle Enter. Rode e experimente:
Console.Write("Como você se chama? ");
string? nome = Console.ReadLine();
Console.Write("Quantos anos você tem? ");
if (int.TryParse(Console.ReadLine(), out int idade))
Console.WriteLine($"Olá, {nome}! Daqui a 10 anos você terá {idade + 10}.");
else
Console.WriteLine("Isso não é um número.");
ana@notebook:~/cs$ dotnet run Program.cs Como você se chama? Ana Quantos anos você tem? 29 Olá, Ana! Daqui a 10 anos você terá 39. [código de saída: 0]
| No campo de entrada | O que acontece |
|---|---|
| Enter | Envia a linha para o programa (o ReadLine() devolve o texto, sem o Enter). |
| Ctrl+D | "Fim da entrada": o ReadLine() devolve null, como no terminal do Linux. |
| Ctrl+C | Interrompe o programa (o mesmo que o botão Parar). |
Random também se repetem nessas novas rodadas (o editor usa a mesma "semente"), então um jogo de adivinhação continua com o mesmo número secreto. Só o que depende do relógio (DateTime.Now, tempo medido) pode mudar entre uma linha e outra; e o que o programa faz antes de perguntar é feito de novo (um arquivo que ele grava é gravado outra vez, numa pasta limpa).Algumas caixas já trazem a entrada pronta, num campo Entrada abaixo do editor (uma linha por Enter). Nelas o programa lê dali e não pergunta nada; você pode mudar o texto do campo e rodar de novo.
Argumentos
O campo Argumentos é o que vem depois do nome do arquivo no terminal. Cada palavra vira um item de args; para um argumento com espaço, use aspas, como no terminal (aula Argumentos da Linha de Comando). Escreva Ana 'Maria Clara' no campo e rode:
Console.WriteLine($"Recebi {args.Length} argumento(s):");
foreach (string a in args)
Console.WriteLine($"- {a}");
ana@notebook:~/cs$ dotnet run Program.cs Ana 'Maria Clara' Recebi 2 argumento(s): - Ana - Maria Clara [código de saída: 0]
Várias abas: vários arquivos
Algumas caixas têm mais de uma aba. Os arquivos que não são .cs (como frutas.txt) ficam na pasta em que o programa roda, e ele pode abri-los com File.ReadAllLines (aula Arquivos). Mude o arquivo de dados e rode de novo:
string[] frutas = File.ReadAllLines("frutas.txt");
Console.WriteLine($"{frutas.Length} frutas:");
foreach (string f in frutas)
Console.WriteLine($"- {f}");
maçã banana uva
Quando há dois ou mais arquivos .cs, eles são compilados juntos, como num projeto (aula Projetos). O terminal mostra então a pasta de um projeto e o comando dotnet run, sem o nome do arquivo:
var conta = new Conta("Ana");
conta.Depositar(150m);
Console.WriteLine($"{conta.Dono}: {conta.Saldo:C}");
class Conta(string dono)
{
public string Dono { get; } = dono;
public decimal Saldo { get; private set; }
public void Depositar(decimal valor) => Saldo += valor;
}
ana@notebook:~/projetos/Exemplo$ dotnet run Ana: R$ 150,00 [código de saída: 0]
Os erros de um projeto terminam com o nome do arquivo de projeto entre colchetes, como no terminal: /home/ana/projetos/Exemplo/Conta.cs(5,12): error CS0103: … [/home/ana/projetos/Exemplo/Exemplo.csproj].
Missões, Restaurar e Ver solução
Uma caixa com Missão tem uma tarefa escrita acima do editor e confere o resultado sozinha. Abaixo da caixa aparece Missão em andamento…, com uma pista do que falta, e, quando você acerta, ✔ Missão cumprida!. A missão olha o que o seu programa mostra, se ele compila, os avisos, o código de saída ou o próprio código, conforme a tarefa.
- Ver solução troca o seu código por uma solução (o editor pergunta antes). Tente sozinho primeiro: errar e consertar é como se aprende.
- Restaurar volta ao código original da aula.
Missão: o programa soma o preço de 3 pães de R$ 2,50, mas mostra o total errado. Conserte a conta.
decimal preco = 2.50m;
int quantidade = 3;
decimal total = preco + quantidade;
Console.WriteLine($"Total: {total:C}");
decimal preco = 2.50m;
int quantidade = 3;
decimal total = preco * quantidade;
Console.WriteLine($"Total: {total:C}");
Parar um programa
Um programa que nunca termina (um laço infinito, por exemplo) não trava a página: clique em ■ Parar. Se ele passar de 15 segundos sem terminar nem pedir entrada, o editor para sozinho e avisa: (o editor parou o programa: ele rodou mais de 15 segundos sem terminar — laço infinito?).
Quando o programa quebra: exceções
Um erro que só aparece com o programa rodando é uma exceção (aula Exceções). O editor mostra a mesma mensagem do .NET no Linux, em inglês, com a linha do problema, e o código de saída 134:
Missão: o array tem 3 notas (posições 0, 1 e 2). Peça a posição 3 e veja a exceção.
int[] notas = { 7, 8, 10 };
Console.WriteLine(notas[2]);
int[] notas = { 7, 8, 10 };
Console.WriteLine(notas[3]);
ana@notebook:~/cs$ dotnet run Program.cs Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array. at Program.<Main>$(String[] args) in /home/ana/cs/Program.cs:line 2 [código de saída: 134]
Leia assim: "exceção não tratada" (Unhandled exception) do tipo IndexOutOfRangeException, "o índice estava fora dos limites do array", na linha 2 do Program.cs. As mensagens do compilador saem em português, mas as das exceções saem em inglês, como no Linux.
O que funciona no editor
- Todo o C# 14 e a biblioteca do .NET 10:
string, coleções, LINQ,record,Regex(inclusive[GeneratedRegex]),System.Text.Json,DateTime,decimal,BigInteger… - Cultura pt-BR (
3,5,R$ 1.234,50, datas em português) e o fuso de São Paulo. - Os avisos dos analisadores do .NET, como no
dotnet run(por exemplo, os avisosIL2026do JSON num arquivo só). Console.ReadLine,args, arquivos (File,StreamWriter,Directory) numa pasta só da caixa,Environment.Exit.async/await,Task.Delay,Task.WhenAll,Thread.Sleep, cancelamento.Console.ForegroundColor: as cores aparecem no terminal da caixa.
O que não funciona (só no seu computador)
- Threads de verdade: o navegador roda o programa numa linha de execução só.
new Thread(…).Start()dáPlatformNotSupportedException, e esperar uma tarefa que ainda não terminou com.Resultou.Wait()também falha. Useawait, que funciona. - Outros programas e a internet:
Process.StartdáPlatformNotSupportedException. OHttpClientsó consegue falar com os poucos sites que liberam o acesso a partir de outras páginas; nos outros, o navegador bloqueia e aparece umaHttpRequestException. - Pacotes NuGet (
#:package,dotnet add package): o editor não baixa pacotes. - O depurador, os testes (
dotnet test) e odotnet publish: rode no seu computador (aulas Depuração, Testes, Publicar).
O que é diferente no editor × no seu computador
| Situação | No seu computador (Linux) | No editor |
|---|---|---|
| Velocidade | rápido | bem mais lento em contas pesadas (o .NET do navegador interpreta o programa); para o guia, não faz diferença |
Números de Random, data e hora | mudam a cada execução | também mudam (e se repetem dentro de uma mesma rodada com entrada digitada) |
Environment.ProcessorCount, Environment.Is64BitProcess, IntPtr.Size | os do computador (ex.: 8, True, 8) | 1, False, 4 |
Environment.UserName, Environment.MachineName | ana, notebook | Browser, localhost |
Converter um object para o tipo errado ((long)(object)5) | Unable to cast object of type 'System.Int32' to type 'System.Int64'. | Specified cast is not valid. (mesma exceção, InvalidCastException) |
| Linhas internas do .NET no rastro de uma exceção | poucas | às vezes outras ou mais (o tipo da exceção, a mensagem e as linhas do seu código são iguais) |
| O mesmo aviso, rodando de novo sem mudar o arquivo | não aparece de novo (o dotnet reaproveita a compilação) | aparece sempre |
Console.ReadKey() | lê uma tecla | lê a primeira letra da linha que você digita e tecla Enter |
Quando dá errado
Cenário: o programa pede o nome, mas a caixa tem o campo Entrada vazio, e o ReadLine() devolve null.
Console.Write("Nome: ");
string? nome = Console.ReadLine();
Console.WriteLine(nome.Length);
ana@notebook:~/cs$ dotnet run Program.cs /home/ana/cs/Program.cs(3,19): warning CS8602: Desreferência de uma referência possivelmente nula. Nome: Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object. at Program.<Main>$(String[] args) in /home/ana/cs/Program.cs:line 3 [código de saída: 134]
O que significa: sem nada para ler, o ReadLine() devolveu null ("nada"), e o programa tentou usar o .Length desse nada. O próprio compilador já tinha avisado (CS8602).
Como consertar: escreva a entrada no campo Entrada, e no código trate o null: string nome = Console.ReadLine() ?? ""; (aula Operadores ??, ?. e ??=).
Cenário: o código usa uma thread.
var t = new Thread(() => Console.WriteLine("Oi da thread!"));
t.Start();
t.Join();
ana@notebook:~/cs$ dotnet run Program.cs Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform. at System.Threading.Thread.ThrowIfNoThreadStart() at System.Threading.Thread.Start(Boolean captureContext) at System.Threading.Thread.Start() at Program.<Main>$(String[] args) in /home/ana/cs/Program.cs:line 2 [código de saída: 134]
O que significa: "operação não suportada nesta plataforma": o navegador não tem threads de verdade. No seu computador, o mesmo código mostra Oi da thread!.
Como consertar: nas aulas de Threads e lock, rode os exemplos no terminal do seu computador; no editor, prefira async/await.
Cenário: a barra de download para em Não consegui carregar o compilador.
O que significa: a internet caiu ou o navegador bloqueou o download.
Como consertar: confira a conexão e clique em Rodar de novo. O editor precisa de um navegador atual (Chrome, Edge, Firefox ou Safari dos últimos anos).
Referência
| Na caixa | Para quê |
|---|---|
| ▶ Rodar / ■ Parar | Compila e roda / interrompe o programa (Ctrl+Enter roda). |
| Abas | Os arquivos da caixa. Os .cs são compilados juntos; os outros ficam na pasta do programa. |
| Argumentos | O que chega em args. |
| Entrada (em algumas caixas) | O que o Console.ReadLine() lê, uma linha por Enter. |
| Campo no terminal | Onde você digita quando o programa pergunta (Enter envia, Ctrl+D encerra a entrada). |
| Restaurar / Ver solução | Volta ao original / mostra uma solução da missão. |
[código de saída: N] | 0 = terminou bem; 1 = não compilou; 134 = exceção não tratada; outro número = o seu Environment.Exit(N) ou return N;. |
Exercícios
1. Você clicou em Rodar e o terminal mostrou error CS0103 e [código de saída: 1]. O que aconteceu?
- O programa rodou e terminou com erro.
- O código não compilou, então nada foi rodado.
- O editor está sem internet.
2. Um programa sem campo Entrada chama Console.ReadLine(). O que o editor faz?
- Dá um erro, porque o navegador não tem teclado.
- Devolve sempre
null. - Mostra um campo no terminal para você digitar a linha.
3. O que quer dizer [código de saída: 134]?
- O programa terminou com uma exceção não tratada.
- O programa terminou bem.
- O compilador achou 134 erros.
4. Complete: no campo Argumentos, para que args[0] seja Maria Clara (com o espaço), escreva o nome entre .
Missão final: o código de saída
Missão: quando o arquivo notas.txt não existe, o programa deve mostrar Arquivo não encontrado. e terminar com o código 3 (Environment.Exit(3)).
if (!File.Exists("notas.txt"))
{
Console.WriteLine("Arquivo não encontrado.");
}
Console.WriteLine(File.ReadAllText("notas.txt"));
if (!File.Exists("notas.txt"))
{
Console.WriteLine("Arquivo não encontrado.");
Environment.Exit(3);
}
Console.WriteLine(File.ReadAllText("notas.txt"));
No terminal da Ana, o código aparece com echo $?:
$ dotnet run saida.cs Arquivo não encontrado. $ echo $? 3
Resumo
- As caixas Experimente compilam C# de verdade com o Roslyn (o compilador do
dotnet10, C# 14) e rodam o programa no .NET 10 em WebAssembly, no navegador. - Na primeira vez, o navegador baixa uns 17 MB; depois, fica guardado.
- O terminal da caixa mostra o comando, os erros e avisos (em português, com o código
CSxxxx), a saída e o[código de saída: N]. Console.ReadLine(): você digita no terminal da caixa (Enter envia, Ctrl+D encerra, Ctrl+C para). Argumentos e abas funcionam como no terminal.- Missões conferem o resultado; Restaurar volta ao original; Ver solução mostra uma solução.
- Diferenças: threads, internet, outros programas e pacotes NuGet só no seu computador; algumas mensagens e linhas internas de exceções podem mudar um pouco; o editor é mais lento em contas pesadas.
- Próximo passo: o seu primeiro programa, linha por linha, em Olá, Mundo.