Вопрос

Я заметил в другом посте, что кто-то сделал что-то вроде:

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

Почему они использовали функцию преобразования, а не:

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

который имеет неявный этаж и преобразует.

Кроме того, что более важно, я заметил в каком-то производственном коде, который я читал:

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

Это то же самое, что:

float f = (float)d;

Являются ли все эти в остальном неявные преобразования просто в классе Convert для полноты картины, или они служат какой-то цели?Я могу понять необходимость .toString(), но не все остальное.

Это было полезно?

Решение

Приведение к int - это неявное усечение, а не неявный настил пола:

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

Я выбираю математику.Этаж или математику.Круглый, чтобы сделать мои намерения более явными.

Другие советы

Округление также обрабатывается по-разному:

x=-2,5 (int)x=-2 Преобразовать.ToInt32(x)=-2
x=-1,5 (int)x=-1 Преобразовать.ToInt32(x)=-2
x=-0,5 (int)x= 0 Преобразовать.ToInt32(x)= 0
x= 0,5 (int)x= 0 Преобразовать.ToInt32(x)= 0
x= 1,5 (int)x= 1 Преобразовать.ToInt32(x) = 2
x= 2,5 (int)x= 2 Преобразовать.ToInt32(x)= 2

Обратите внимание на случаи x=-1,5 и x=1,5.
В некоторых алгоритмах используемый метод округления имеет решающее значение для получения правильного ответа.

Вы можете использовать Convert, когда у вас есть строка, которую вы хотите преобразовать в int

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

Convert и casting выдадут исключение, если они завершатся неудачей.

т.е. это все равно вызовет исключение, оно не вернет 0:

Convert.ToInt32("1234NonNumber");

Во многих случаях преобразование и приведение будут иметь один и тот же результат, но приведение часто в разы проще для чтения.

Преобразовать.ToInt32() используется для строк (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx) в то время как приведение может использоваться только для типов, имеющих внутренние преобразователи (числовые типы).Настоящий фокус заключается в выборе между Int32.Parse и Convert.ToInt32().Преобразовать.ToInt32() допускает параметр null и возвращает 0, в то время как Int32.Parse() выдаст исключение ArgumentNullException.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top