Pergunta
Em .Net você pode ler um valor de string em outro tipo de dados usando <datatype>.parse
ou Convert.To<DataType>
.
Não estou familiarizado com os fundamentos de análise versus conversão, por isso fico sempre perplexo quando me perguntam qual é melhor/mais rápido/mais apropriado.
Então - qual é o melhor caminho em que tipo de circunstâncias?
Solução
O Convert.ToXXX()
métodos são para objetos que podem ser do tipo correto ou semelhante, enquanto .Parse()
e .TryParse()
são especificamente para strings:
//o is actually a boxed int
object o = 12345;
//unboxes it
int castVal = (int) 12345;
//o is a boxed enum
object o = MyEnum.ValueA;
//this will get the underlying int of ValueA
int convVal = Convert.ToInt32( o );
//now we have a string
string s = "12345";
//this will throw an exception if s can't be parsed
int parseVal = int.Parse( s );
//alternatively:
int tryVal;
if( int.TryParse( s, out tryVal ) ) {
//do something with tryVal
}
Se você compilar com sinalizadores de otimização, o TryParse é muito rápido - é a melhor maneira de obter um número de uma string.No entanto, se você tiver um objeto que pode ser um int ou uma string, Convert.ToInt32 é mais rápido.
Outras dicas
Aqui está uma resposta para você:
http://www.dotnetspider.com/forum/ViewForum.aspx?ForumId=77428
Embora eu pense nas versões modernas do .NET, a melhor coisa a fazer é usar TryParse em qualquer caso, se houver alguma dúvida de que a conversão funcionará.
Eu sou um grande fã de TryParse, pois evita muita dor de cabeça com a detecção de erros quando há uma chance de o valor que você vai analisar não ser do tipo apropriado.
Meu pedido geralmente é:
- Analisar (se eu tiver certeza de que o valor será do tipo certo e tento garantir isso)
- TryParse (se não tiver certeza, o que acontece sempre que a entrada do usuário está envolvida ou a entrada de um sistema que você não pode controlar)
- Convert (que acho que não uso desde que comecei a usar o Parse e o TryParse, mas posso estar errado)
Há também o método DirectCast que você deve usar somente se tiver certeza de qual é o tipo do objeto.É mais rápido, mas não faz nenhuma verificação adequada.Eu uso o DirectCast quando extraio valores de um DataTable de tipo flexível quando conheço o tipo de cada coluna.
Se você precisa de velocidade, tenho certeza que um lançamento direto é o caminho mais rápido.Dito isto, normalmente uso .Parse ou .TryParse porque parece facilitar a leitura das coisas e se comportar de maneira mais previsível.
O Convert realmente chama o Parse nos bastidores, eu acredito.Portanto, há pouca diferença aí e parece ser apenas uma questão de gosto pessoal.