Qual a diferença entre Int.Parse e Convert.ToInt32?

Tenho encontrado algumas confusões com isso, então vamos exclarecer.
int.Parse é utilizado somente para converter string em int disparando uma Exception se o valor convertido for null, “”(string vazia) ou qualquer caractere não numérico.


int x = int.Parse("123"); // 123
int x = int.Parse(""); // System.FormatException
int x = int.Parse("123@"); // System.FormatException
int x = int.Parse(null); // System.ArgumentNullException


Convert.ToInt32 é utilizado para converter outros tipos de objeto (object, bool, string, etc) em um int, internamente ele utiliza int.Parse, porem adicionando a feature de retornar zero se o valor convertido for null, no mais é igual ao int.Parse.


int x = Convert.ToInt32("123");// 123
int x = Convert.ToInt32("");//System.FormatException
int x = Convert.ToInt32("123@");//System.FormatException
int x = Convert.ToInt32(null);// 0

int.Parse é mais performático, Convert.ToInt trabalha com mais tipos alem de string e não dispara exceção se o argumento for null.

Sugestão: Se você tem uma string e espera que sempre lhe retorne um inteiro (por exemplo, o retorno de uma chamada a um web service) você deve utilizar int.Parse. Se você esta fazendo leitura de dados inseridos pelo usuário, você deve usar int.TryParse que possui um melhor controle na situação do usuário inserir entradas inválidas.
Você deve utilizar Convert.ToInt32 nos mesmos casos citados acima para int.Parse porem quando o argumento não for do tipo string.

Uma solução bacana é utilizar métodos de extensão e fazer uma conversão segura:


namespace Parse.Test
{
    public static class StringExtensions
    {
        public static int ToInt32Safe(this string text)
        {
            int result;
            return int.TryParse(text, out result) ? result : 0;
        }
    }
}

Como usar:


int x = "123".ToInt32Safe(); //123
int x = "".ToInt32Safe(); //0
int x = "123@".ToInt32Safe(); //0

string nullString = null;
int x = nullString.ToInt32Safe(); //0