Pergunta

Eu observei em outro post, alguém tinha feito algo como:

double d = 3.1415;
int i = Convert.ToInt32(Math.Floor(d));

Por que usar a função de conversão, em vez de:

double d = 3.1415;
int i = (int)d;

que tem um piso implícita e converso.

Além disso, mais respeito, notei em algum código de produção que estava lendo:

double d = 3.1415;
float f = Convert.ToSingle(d);

Isso é o mesmo que:

float f = (float)d;

São todas essas conversões de outra forma implícita apenas na classe Convert para a integralidade, ou eles servem a um propósito? Eu posso entender a necessidade de .ToString (), mas não o resto.

Foi útil?

Solução

A projeção para int é truncamento implícita, não piso implícito:

double d = -3.14;
int i = (int)d;
// i == -3

Eu escolho Math.Floor ou Math.Round para fazer minhas intenções mais explícito.

Outras dicas

O arredondamento também é tratado de forma diferente:

x = -2.5 (int) x = -2 Convert.ToInt32 (x) = - 2 | x = -1,5 (int) = x -1 Convert.ToInt32 (x) = - 2 | x = -0.5 (int) x = 0 Convert.ToInt32 (x) = 0
x = 0,5 (int) x = 0 Convert.ToInt32 (x) = 0
x = 1,5 (int) x = 1 Convert.ToInt32 (x) = 2 | x = 2,5 (int) x = 2 Convert.ToInt32 (x) = 2 |

Observe o x = -1.5 e x = 1,5 casos.
Em alguns algoritmos, o método de arredondamento utilizado é fundamental para obter a resposta certa.

Você pode usar Convert quando você tem uma seqüência que você deseja converter para um int

int i = Convert.ToInt32("1234");

Convert e fundição vai jogar tanto uma exceção se eles falham.

ou seja, isso ainda vai lançar uma exceção, não retornará 0:

Convert.ToInt32("1234NonNumber");

Em muitos casos Converter e fundição terá o mesmo resultado, mas um elenco é muitas vezes mais fácil de ler.

Convert.ToInt32 () é usado em strings ( http: // MSDN .microsoft.com / en-us / library / sf1aw27b.aspx ), enquanto fundição só pode ser usado em tipos que têm conversores internos (tipos numéricos). O verdadeiro truque vem em decidir entre Int32.Parse e Convert.ToInt32 (). Convert.ToInt32 () é tolerante de um parâmetro nulo e retorna 0, enquanto Int32.Parse () lançará um ArgumentNullException.

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