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.

Você vai aprender
  • 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

TeclaO que faz
Ctrl+Enter (Mac: Cmd+Enter)Roda o código, sem tirar a mão do teclado.
TabInsere o recuo (4 espaços). Com várias linhas selecionadas, recua todas.
Shift+TabTira um nível de recuo.
EnterPula a linha mantendo o recuo; depois de {, ( ou [, recua mais um nível. Um } sozinho na linha volta um nível.
EscSai 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.

Dica: o código 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 entradaO que acontece
EnterEnvia 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+CInterrompe o programa (o mesmo que o botão Parar).
Como o editor faz isso: o navegador não deixa um programa WebAssembly parar no meio e esperar o teclado. Então, quando o programa pede uma linha que você ainda não digitou, o editor o encerra, mostra o campo e, quando você tecla Enter, roda o programa de novo desde o começo, entregando as linhas que você já digitou. Você não percebe: a saída é a mesma. Os números do 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 avisos IL2026 do 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 .Result ou .Wait() também falha. Use await, que funciona.
  • Outros programas e a internet: Process.Start dá PlatformNotSupportedException. O HttpClient só consegue falar com os poucos sites que liberam o acesso a partir de outras páginas; nos outros, o navegador bloqueia e aparece uma HttpRequestException.
  • Pacotes NuGet (#:package, dotnet add package): o editor não baixa pacotes.
  • O depurador, os testes (dotnet test) e o dotnet publish: rode no seu computador (aulas Depuração, Testes, Publicar).

O que é diferente no editor × no seu computador

SituaçãoNo seu computador (Linux)No editor
Velocidaderápidobem 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 horamudam a cada execuçãotambém mudam (e se repetem dentro de uma mesma rodada com entrada digitada)
Environment.ProcessorCount, Environment.Is64BitProcess, IntPtr.Sizeos do computador (ex.: 8, True, 8)1, False, 4
Environment.UserName, Environment.MachineNameana, notebookBrowser, 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çãopoucasà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 arquivonão aparece de novo (o dotnet reaproveita a compilação)aparece sempre
Console.ReadKey()lê uma teclalê 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 caixaPara quê
▶ Rodar / ■ PararCompila e roda / interrompe o programa (Ctrl+Enter roda).
AbasOs arquivos da caixa. Os .cs são compilados juntos; os outros ficam na pasta do programa.
ArgumentosO que chega em args.
Entrada (em algumas caixas)O que o Console.ReadLine() lê, uma linha por Enter.
Campo no terminalOnde você digita quando o programa pergunta (Enter envia, Ctrl+D encerra a entrada).
Restaurar / Ver soluçãoVolta 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?

  1. O programa rodou e terminou com erro.
  2. O código não compilou, então nada foi rodado.
  3. O editor está sem internet.

2. Um programa sem campo Entrada chama Console.ReadLine(). O que o editor faz?

  1. Dá um erro, porque o navegador não tem teclado.
  2. Devolve sempre null.
  3. Mostra um campo no terminal para você digitar a linha.

3. O que quer dizer [código de saída: 134]?

  1. O programa terminou com uma exceção não tratada.
  2. O programa terminou bem.
  3. 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 dotnet 10, 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.