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?

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.


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)

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.


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.


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).


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.


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.


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.


4
Mas TryParseretorna trueou false? É assim que você saberá se era "válido".
Paul Draper
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.