Diferença entre int.Parse() e Convert.ToInt()

Olá pessoal. Esses dias ocorreu essa dúvida e confesso que parei para ler a documentação e brincar. Apesar de “simples”, creio que tenha muito developer que acaba confundindo o uso ou achando que é “tudo a mesma coisa.

E já sendo bem direto, no funcionamento não temos nenhuma diferença. Eu disse no funcionamento. Onde a entrega do objetivo primário é “converter para inteiro”.

Se você tem uma string e você sabe que ela sempre será um número inteiro (por exemplo, se algum serviço web está te entregando um número inteiro em formato string), você pode usar o Int32.Parse().

Agora se você está recebendo dados de entrada enviados pelo usuário (um formulário web por exemplo), você deve usar o Int32.TryParse(), uma vez que este método permite um controle mais refinado da situação quando o usuário informa um valor inválido. Este controle fica claro quando é retornado 0 sempre que não há sucesso na conversão para inteiro (seja nulo, overflow, formato inválido, etc).

Já o Convert.ToInt32() recebe um objeto como argumento e invoca o método Int32.TryParse() quando ele descobre que o objeto recebido é uma string. Por isso que quando ele não consegue converter para inteiro ele retorna 0 e não lança o ArgumentNullException. Com isso vemos que o Convert.ToInt32() é provavelmente um pouquinho mais lento do que Int32.Parse() porque ele tem que verificar o seu tipo no argumento.

E falando dem performance, fiz um teste que faz 900.000.000 de conversões de uma string para int usando os três métodos. O resultado temos abaixo.

image

Veja que o TryParse() é o mais veloz e o ConvertTo o mais lento. O código está no GitHub e você pode baixar para testar na sua máquina.

Por fim, gostaria de recaptular que o Int32.Parse() e Int32.TryParse() só podem converter strings. Convert.ToInt32() pode trabalhar com qualquer classe que implementa IConvertible, sendo assim, se você passar uma string via Convert, o efeito será equivalente aos métodos Parse/TryParse, porém sabe-se agora que teremos uma sobrecarga extra para comparações de tipo e outras coisinhas. Portanto, se você estiver convertendo strings, TryParse() é provavelmente a melhor opção.

É pra não ter mais dúvidas.
Tem subjeções? Deixe seu comentário.

Abraço!