Ответ 1
Приведение в int - это неявное усечение, а не неявное покрытие пола:
double d = -3.14;
int i = (int)d;
// i == -3
Я выбираю Math.Floor или Math.Round, чтобы сделать мои намерения более явными.
Я заметил в другом посте, кто-то сделал что-то вроде:
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
Я выбираю Math.Floor или Math.Round, чтобы сделать мои намерения более явными.
Округление также обрабатывается по-разному:
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
Обратите внимание на случаи x = -1.5 и x = 1.5.
В некоторых алгоритмах используемый метод округления имеет решающее значение для получения правильного ответа.
Вы можете использовать Convert, когда у вас есть строка, которую вы хотите преобразовать в int
int i = Convert.ToInt32("1234");
Преобразование и литье будут выдавать исключение, если они не работают.
i.e, это все равно вызовет исключение, оно не вернет 0:
Convert.ToInt32("1234NonNumber");
Во многих случаях преобразование и литье будут иметь одинаковый результат, но приведение часто бывает легче читать.
Convert.ToInt32() используется для строк (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx), в то время как литье может использоваться только для типов с внутренними преобразователями ( числовые типы). Реальный трюк приходит к решению между Int32.Parse и Convert.ToInt32(). Convert.ToInt32() терпимо относится к нулевому параметру и возвращает 0, а Int32.Parse() генерирует исключение ArgumentNullException.