Analisar v. TryParse

111

Qual é a diferença entre Parse () e TryParse ()?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

Existe alguma forma de verificação de erros, como um bloco Try-Catch?

Kredns
fonte

Respostas:

155

Parselança uma exceção se não puder analisar o valor, enquanto TryParseretorna um boolindicando se foi bem-sucedido.

TryParsenão apenas try/ catchinternamente - o ponto principal disso é que ele é implementado sem exceções para que seja rápido. Na verdade, a maneira mais provável de ser implementado é que internamente o Parsemétodo chamará TryParsee lançará uma exceção se retornar false.

Resumindo, use Parsese tiver certeza de que o valor será válido; caso contrário, use TryParse.

Greg Beech
fonte
1
"internamente, o método Parse chamará TryParse" Exceto que o Parse antecede TryParse em várias versões. Claro, eles poderiam ter movido a implementação principal para TryParse ...
Joel Coehoorn
4
@Joel - Presumi que eles teriam movido a implementação, mas acabei de dar uma olhada no refletor e são implementações separadas com exatamente o mesmo código, exceto um com 'jogar ...' e outro com 'retorno falso'. Eu me pergunto por que eles não estão consolidados ?!
Greg Beech
6
Embora, pensando bem, o Parse lance várias exceções diferentes, portanto, se tudo o que ele tivesse fosse um bool de TryParse, ele não saberia qual lançar.
Greg Beech
5
"use o Parse se tiver certeza de que o valor será válido". Eu acrescentaria, "mas você reconhece a possibilidade de estar errado". Se você tivesse 100% de certeza de que ele pode analisar, você poderia usar o TryParse corretamente, que pode ser mais rápido.
Jon
2
E por "diferentes exceções", @GregBeech significa a mensagem, não a classe.
Paul Draper
26

Se a string não puder ser convertida em um inteiro, então

  • int.Parse() vai lançar uma exceção
  • int.TryParse() retornará falso (mas não lançará uma exceção)
M4N
fonte
E se eu usar int.ExperimenteParse (some_method_that_throws_exception (), out int test)? Ele detectará alguma exceção ou apenas as relacionadas à análise?
Alexandru Antochi
@AlexandruAntochi Você não deve fazer uma pergunta como um comentário. Isso tornará quase impossível que outras pessoas se beneficiem de respostas úteis. No entanto, para fazer valer a pena, a resposta à sua pergunta é não, int. TryParse não vai jogar. Se o método falhar na análise, ele refletirá isso apenas por um valor de retorno false. Isso torna conveniente o uso de if (int.ExperimenteParse ... para fazer algo apenas se a análise for bem-sucedida.
Rob
3

O método TryParse permite que você teste se algo é analisável. Se você tentar o Parse como na primeira instância com um int inválido, você obterá uma exceção enquanto no TryParse, ele retorna um booleano permitindo que você saiba se a análise foi bem-sucedida ou não.

Como nota de rodapé, passar null para a maioria dos métodos TryParse lançará uma exceção.

Ray Booysen
fonte
Passar null para tipos básicos (int, double, DateTime etc.) NÃO lançará uma exceção
Dr. Yunke,
3

TryParse e o imposto de exceção

O Parse lança uma exceção se a conversão de uma string para o tipo de dados especificado falhar, enquanto o TryParse evita explicitamente o lançamento de uma exceção.

Gulzar Nazim
fonte
TryParse lançará uma exceção se você passar null para a maioria dos métodos TryParse integrais.
Ray Booysen
1
Ótimo link. Estou surpreso que ninguém ainda não tenha começado a discussão "qual é o melhor ou qual prática de codificação deve ser aplicada".
Christian Madsen
0

TryParse não retorna o valor, ele retorna um código de status para indicar se a análise foi bem-sucedida (e não lança uma exceção).

Mark Brittingham
fonte
6
TryParse retorna o valor por meio do parâmetro dois que é especificado com a palavra-chave out.
Christian Madsen de
0

Para que conste, estou testando dois códigos: Que simplesmente tentam converter de uma string em um número e, se falhar, atribua o número zero.

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

e:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

Para c #, a melhor opção é usar tryparse porque a alternativa try & Catch lançou a exceção

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

Por ser dolorosamente lento e indesejável, no entanto, o código não para, a menos que a exceção de Debug seja encerrada com ela.

Magalhães
fonte
O primeiro fragmento de código não faz nada, pois tmpint já estará definido como zero se a string não puder ser analisada como um int.
Andrew Neely
0

Eu sei que é um post muito antigo, mas pensei em compartilhar mais alguns detalhes sobre o Parse vs TryParse.

Tive um cenário em que DateTime precisa ser convertido em String e se datevalue null ou string.empty estávamos diante de uma exceção. Para superar isso, substituímos o Parse por TryParse e obteremos a data padrão.

Código Antigo:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

Novo Código:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

Tem que declarar outra variável e usada como Out para TryParse.

LifeOfPi
fonte
Você não precisa inicializar startDatee, endDatecomo DateTime.TryParsesempre, os substituirá por DateTime.MinValue. Se as representações de data incorretas devem ser convertidas em um valor diferente, verifique o valor de retorno de DateTime.TryParsee se for falso, defina o valor explicitamente.
Palec
Usando DateTime?( DateTime nullable )
Kiquenet 10/06
-1

double.Parse ("-"); levanta uma exceção, enquanto double.TryParse ("-", out parsed); analisa para 0, então acho que TryParse faz conversões mais complexas.

eyaler
fonte
4
Mas TryParseretorna trueou false? É assim que você saberá se era "válido".
Paul Draper