Parse e TryParse no C#
10/02/2022
André Baltieri

Parse e TryParse são dois métodos que temos para converter, ou tentar converter, uma string para outro de forma explícita no C#.

Parse e TryParse

Os métodos Parse e TryParse nos permitem converter ou tentar converter uma string para um outro tipo. No caso, todos os tipos built-in do .NET possuem estes métodos.

Utilizando o Parse

O Parse funciona como uma extensão aos métodos built-in, onde podemos invocar o método informando uma string, como por exemplo int.Parse("123").

Abaixo podemos ver três exemplos de conversões de string para outros tipos built-in utilizando Parse, incluindo um DateTime que é uma estrutura, um tipo mais complexo.

var valor = int.Parse("123");
var valor2 = bool.Parse("true");
var valor3 = DateTime.Parse("01/01/2022");

Console.WriteLine(valor);
Console.WriteLine(valor2);
Console.WriteLine(valor3);

Como resultado da execução deste programa temos o seguinte texto sendo impresso na tela.

123
True
1/1/2022 12:00:00 AM

IFormatProvider

Continuando o exemplo anterior, temos um DateTime e estamos passando o valor 01/01/2022 para o mesmo. Este valor foi proposital para não causar nenhum erro.

Agora vamos considerar uma nova data, 28/10/2021, onde temos o formato dd/MM/yyyy, um formato utilizado aqui no Brasil, mas diferente dos EUA (Formato padrão do .NET) que utiliza MM/dd/yyyy.

Unhandled exception. System.FormatException: String '28/10/2021' was not recognized as a valid DateTime.
   at System.DateTime.Parse(String s)
   at Program.<Main>$(String[] args) in C:\dev\CsharpTryParse\Program.cs:line 8

Neste caso, a conversão falharia, pois 28/10/2021 não é uma data válida nos EUA, o correto seria 10/28/2021, mas felizmente conseguimos contornar isto utilizando uma cultura.

var culture = new CultureInfo("pt-BR");
var valor3 = DateTime.Parse("28/10/2021", culture);

Note que agora temos um objeto do tipo CultureInfo, que define a cultura como pt-BR (Português do Brasil) e quando executamos o Parse, informamos também a cultura, resultando no sucesso da conversão.

NumberStyles

Outro modificador que podemos utilizar (Existem vários) é o NumberStyles, que nos permite trabalhar nas pontuações dos números no caso de inteiros.

Console.WriteLine(int.Parse("1234", NumberStyles.None)); 
// 1234

Console.WriteLine(int.Parse("12123.0", NumberStyles.AllowDecimalPoint)); 
// 12123

Console.WriteLine(int.Parse("123,456", NumberStyles.AllowThousands)); 
// 12356

Ainda podemos adicionar a cultura aos números, junto aos NumberStyles para trabalhar na relação "ponto ou vírgula` dos valores.

TryParse

Como pudemos notar nos exemplos anteriores, ao usar o Parse temos uma tentativa de conversão de uma string para outro tipo, o que nem sempre ocorrerá com sucesso.

No caso demonstrado com o DateTime mesmo, tivemos um FormatException pois não informamos a data no formato correto.

Unhandled exception. System.FormatException: String '28/10/2021' was not recognized as a valid DateTime.
   at System.DateTime.Parse(String s)
   at Program.<Main>$(String[] args) in C:\dev\CsharpTryParse\Program.cs:line 8

Para evitar este tipo de situação, temos o TryParse que resulta em um booleano informando se a conversão foi possível e caso verdade, o valor da conversão.

var deuCerto = int.TryParse("45689", out var valor);

Console.WriteLine(deuCerto);
Console.WriteLine(valor);

Note que o TryParse faz uso do out var valor, então o resultado direto da execução dele é um bool e não o valor convertido em sí. Este valor pode ser extraído da variável definida no out.

Como resultado de uma conversão de sucesso, temos o seguinte texto sendo impresso no terminal.

True
45689

Agora vamos ao segundo cenário, onde o TryParse mais se destaca. Aqui temos uma tentativa de conversão que vai falhar, afinal estamos tentando converter "asdaasd" para um int.

var deuCerto = int.TryParse("asdaasd", out var valor);

Console.WriteLine(deuCerto);
Console.WriteLine(valor);

Neste caso, não teremos uma exceção e sim os valores false para o resultado da execução e 0 para o int. Isto ocorre pois o int é um tipo de valor e seu valor inicial é sempre 0.

False
0

Conclusão

Fazer conversões de valores no C# é uma tarefa fácil e temos vários recursos para isto, incluindo o Parse e TryParse como vimos neste artigo.

Conheça o autor

André Baltieri

Microsoft MVP

Me dedico ao desenvolvimento de software desde 2003, sendo minha maior especialidade o Desenvolvimento Web. Durante esta jornada pude trabalhar presencialmente aqui no Brasil e Estados Unidos, atender remotamente times da ?ndia, Inglaterra e Holanda, receber 8x Microsoft MVP e realizar diversas consultorias em empresas e projetos de todos os tamanhos.

An unhandled error has occurred. Reload 🗙