Solicitação de dados do usuário - Série Spectre Console
Os aplicativos de console em C# sempre foram a maneira mais simples de aprender como um programa lê a entrada do usuário e exibe a saída. Em sua série Spectre.Console, Tim Corey mostra como ir muito além do simples prompt de comando em preto e branco. Neste artigo, analisaremos detalhadamente o vídeo " Solicitando dados do usuário - Série Spectre Console " para ver como ele coleta entradas, lida com valores numéricos, realiza verificações de erros e torna seu programa mais amigável — tudo isso sem modificar manualmente o código padrão. Os marcadores de tempo estão incluídos para que você possa ir diretamente para o ponto certo do vídeo.
Introdução: Entrada de linha de comando facilitada
Logo no início, Tim nos lembra que o Spectre.Console pode transformar a entrada de comandos C comuns em algo visualmente atraente. Em vez de escrever um método estático completo void Main(string[] args) e depois ler manualmente do fluxo de entrada padrão com Console.ReadLine(), analisá-lo e lidar com exceções, Spectre.Console encapsula isso para você.
Nas palavras de Tim (0:17), esta sessão mostrará como "solicitar entrada do usuário, validar os dados e convertê-los para o tipo de dados apropriado" — uma habilidade fundamental para qualquer desenvolvedor que trabalhe com um console ou prompt de comando.
Lendo Valores Inteiros com Ask
O primeiro exemplo de Tim (0:35) é um exemplo familiar: perguntar ao usuário qual é a sua idade. Tradicionalmente, em C#, você escreveria:
static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}
static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}
Este exemplo mostra o ponto de entrada clássico de um programa em C#, a função main, e como receber um parâmetro de entrada do teclado através do console. Você também precisa usar int.Parse ou Convert.ToInt32 para converter a string de entrada em um valor inteiro (int). Tim destaca que você deve lidar com entradas inválidas e lançar ou capturar exceções por conta própria.
Com o Spectre.Console, ele simplesmente escreve:
int age = AnsiConsole.Ask<int>("What is your age?");
int age = AnsiConsole.Ask<int>("What is your age?");
Essa única linha de código lê a entrada, converte-a em um valor inteiro e exibe uma mensagem de erro em vermelho se o usuário digitar caracteres não numéricos — sem necessidade de código adicional de verificação de erros. Quando o usuário pressiona Enter, o método lê a entrada, a converte para um tipo numérico e a armazena na variável idade.
Entrada booleana e por que o prompt é melhor
Em seguida (1:14), Tim demonstra como solicitar um valor booleano:
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
Se o usuário digitar "verdadeiro" ou "falso", funciona. Mas se digitarem "sim", o Spectre.Console exibe um erro em vermelho. Isso mostra que enquanto Ask

É aqui que Tim passa a usar uma API mais flexível — Prompt — que se comporta mais como uma mini classe que você pode personalizar.
Usando TextPrompt para Escolhas
Às 3:02, Tim muda de "Perguntar" para "Solicitar" com um prompt de texto.
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));
Quando o programa é executado (4:48), o console mostra [Sim/Não] após a pergunta. Este é o Spectre.Console decorando a linha de comando para que o usuário possa ver facilmente as respostas aceitáveis. Se você digitar qualquer outra coisa, o método a receberá, verificará na lista e exibirá uma mensagem amigável informando que você deve selecionar uma opção disponível.

Adicionando um valor padrão
Tim então adiciona um valor padrão (5:16):
.DefaultValue("Yes")
.DefaultValue("Yes")
Agora, quando o programa é executado, o usuário pode simplesmente pressionar Enter — um retorno de carro sem texto — e o método atribui automaticamente o valor "Sim" à variável. Isso é ótimo quando você deseja armazenar um valor padrão razoável sem código extra no seu método principal.
Solicitação de números inteiros com validação
Às 6:01, Tim mostra um exemplo mais completo com entrada de números inteiros. Ele usa um novo TextPrompt para perguntar a idade novamente, mas adiciona lógica de validação diretamente no prompt:
int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));
int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));
Nesse caso, o prompt não apenas converte os valores de string do fluxo de entrada padrão em um tipo numérico, mas também realiza verificações de erros com base em regras de negócio — como não permitir idades negativas. Tim testa ao vivo (8:31): digitar -1 aciona a mensagem "Você ainda não nasceu". Digitar 150 aciona a mensagem "Você é muito velho". Somente entradas válidas permitem que o programa continue para a próxima linha.

Essa validação integrada elimina a necessidade de escrever manualmente instruções if na função principal, chamar métodos de análise sintática e lidar com exceções.
Perguntar versus sugerir: quando usar cada um
Às 9h, Tim resume:
-
Ask: Rápido e simples. Ideal quando seu programa precisa apenas ler um parâmetro de entrada e convertê-lo para um tipo conhecido.
- Prompt: Mais poderoso. Permite adicionar opções, valores padrão e validações. Ótimo para criar aplicativos de console mais complexos ou para integrar com outros programas que chamam seu arquivo executável com argumentos de linha de comando.
Ambas as abordagens ainda se encaixam perfeitamente no seu ponto de entrada static void Main(string[] args) ou mesmo public static void Main(string[] args). Você também pode acessar os argumentos (args) para ler os argumentos da linha de comando passados durante a execução do programa, combinar isso com os prompts do Spectre.Console e gerar uma string formatada corretamente usando string.Format ou interpolação.
Por que isso é importante para desenvolvedores de console
Tim conclui (9:19) observando como essa abordagem "leva sua capacidade de solicitar entrada do usuário para o próximo nível". Com Spectre.Console, você não precisa mais escrever código repetitivo para ler a entrada do teclado, convertê-la com a classe Convert e exibir mensagens padrão. Em vez disso, você recebe:
-
Saída rica em cores no prompt de comando.
-
Análise automática de tipos numéricos, valores de ponto flutuante de dupla precisão ou valores de cadeia de caracteres.
-
Tratamento amigável de erros para entradas inválidas.
- A capacidade de combinar prompts com argumentos tradicionais da linha de comando para modelos de entrada híbridos.
Isso facilita o ensino do método principal, dos tipos de dados e dos parâmetros de entrada para iniciantes, permitindo ainda a criação de aplicativos de console de nível profissional no Visual Studio ou em qualquer outro editor.
Conclusão
Seguindo o passo a passo de Tim Corey no vídeo , você aprenderá:
-
Como usar o Ask do Spectre.Console para ler e converter a entrada do usuário.
-
Como usar o TextPrompt para apresentar escolhas, padrões e validação.
-
Como esses prompts se encaixam naturalmente no seu ponto de entrada Main(string[] args) junto com os argumentos da linha de comando.
- Como reduzir a verificação de erros repetitiva e tornar seus aplicativos de linha de comando mais amigáveis.
Tudo o que Tim mostra ainda é compilado em um único arquivo executável que você pode executar a partir da linha de comando, passar argumentos para ele ou incorporar em aplicativos ou ferramentas maiores do Windows Forms. É uma forma moderna de lidar com a entrada do usuário, mantendo a simplicidade do console C# e sua conhecida função main.
