С# Кастинг с десятичной запятой
Что, если таковые имеются, есть разница между?
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
Ответы
Ответ 1
Нет никакой разницы. Если вы посмотрите на источник:
В десятичной системе:
public static explicit operator decimal(double value)
{
return new decimal(value);
}
В Конвертировать:
public static decimal ToDecimal(float value)
{
return (decimal) value;
}
Итак, в конце концов все они звонят new decimal(double)
.
Ответ 2
Все они добиваются одинаковых результатов. Однако здесь объясняется более сложное объяснение:
-
Метод 1 создает новую переменную, которая явно вводит myDouble
для ввода decimal
. Когда вы произносите, вы говорите: "Этот объект типа A на самом деле является объектом типа B-производным от-A или существует оператор литья, чтобы отличать A от B".
-
Метод 2 создает новую переменную, которая преобразует myDouble
в соответствующий тип (decimal
) через перегрузку конструктора. Когда вы вызываете конструктор, вы говорите: "Создайте новый объект на основе аргументов, переданных в конструктор".
-
Метод 3 преобразует базовый тип данных (double
) в другой базовый тип данных (decimal
).
Когда вы используете что-то вроде Convert.ToDecimal()
, вы говорите: "Этот объект не относится к типу B, но существует способ превратить его в объект типа B".
Относительно Convert
MSDN заявляет:
-
Существует метод преобразования для преобразования каждого базового типа в любой другой базовый тип. Однако фактическая операция преобразования относится к трем категориям:
-
Преобразование из типа в себя просто возвращает этот тип. Фактически не выполняется преобразование.
- Преобразование, которое не может дать значимого результата, вызывает InvalidCastException. На самом деле преобразование не выполняется. Исключение выбрано для преобразований из Char в Boolean, Single, Double, Decimal или DateTime, а из этих типов - в Char. Исключение выбрано для конверсий из DateTime для любого типа, кроме String, и любого типа, кроме String, в DateTime.
Любой базовый тип, отличный от описанного выше, может быть преобразован в любой другой базовый тип и из любого другого.
Ответ 3
Нет никакой разницы, фактически, с функциональной точки зрения.
Это разные способы достижения такого же результата.
Важно, чтобы в случае Convert.ToDecimal у вас есть возможность указать формат IFormatProvider (культура), чтобы вы получили больше гибкость.
Если вы не заботитесь о мультикультурной среде, выберите любой из них, который вам нравится.