Respostas:
Parse
lança uma exceção se não puder analisar o valor, enquanto TryParse
retorna um bool
indicando se foi bem-sucedido.
TryParse
não apenas try
/ catch
internamente - 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 Parse
método chamará TryParse
e lançará uma exceção se retornar false
.
Resumindo, use Parse
se tiver certeza de que o valor será válido; caso contrário, use TryParse
.
Se a string não puder ser convertida em um inteiro, então
int.Parse()
vai lançar uma exceçãoint.TryParse()
retornará falso (mas não lançará uma exceção)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.
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 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).
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.
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.
startDate
e, endDate
como DateTime.TryParse
sempre, 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.TryParse
e se for falso, defina o valor explicitamente.
DateTime?
( DateTime nullable )
double.Parse ("-"); levanta uma exceção, enquanto double.TryParse ("-", out parsed); analisa para 0, então acho que TryParse faz conversões mais complexas.
TryParse
retorna true
ou false
? É assim que você saberá se era "válido".