В чем разница между 0d и (double) 0?

#c#

#c#

Вопрос:

Пример 1:

 if ((Value ?? 0d) <= 0d)
{
    //some code
}
 

Пример 2:

 if ((Value ?? (double)0) <= (double)0)
{
    //some code
}
 

В чем разница между этими двумя? и какой из них лучше использовать?

Комментарии:

1. FWIW: (Value ?? 0) <= 0 (рекламные акции типа «ура»)

2. MSDN сообщает: по умолчанию действительный числовой литерал в правой части оператора присваивания обрабатывается как double . Однако, если вы хотите, чтобы целое число обрабатывалось как double, используйте суффикс d или D.

3. На самом деле оба компилируются в один и тот же код, во втором случае приведение во время выполнения отсутствует.

4. @UlugbekUmirov, это было бы любезно предоставлено оптимизацией компилятора, я бы сказал, что вполне может быть разница в отладке, но не в выпуске. Несмотря на это, приведение литерала одного типа к другому, когда вы могли бы просто использовать литерал нужного вам типа, в первую очередь излишне усложняет код.

5. @jmcilhinney В этом случае он также будет оптимизирован в режиме отладки. Но я согласен с вами, что первый метод является правильным.

Ответ №1:

Оба фрагмента кода эквивалентны, поскольку приведение к типу будет выполняться компилятором во время компиляции, а результат обрабатывается как константа. Обратите внимание, что это стандартное поведение, а не просто оптимизация компилятора; в противном случае вы не смогли бы использовать приведения для констант:

     const double d1 = (double)0;          // allowed
    const double d2 = Math.Pow(2, 4);     // error: "The expression being assigned to 'd2' must be constant"
 

Тем не менее, предпочтительнее указывать правильный буквальный суффикс, поскольку он сохраняет ваш код кратким. Другим популярным соглашением для указания двойных значений является добавление .0 :

 if ((Value ?? 0.0) <= 0.0)
 

Ответ №2:

Первый вариант лучше.

Во-вторых, приведение выполняется во время выполнения. Первый сразу объявляет константу как двойную.