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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top