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