C # (Если <или If>) против Math.Sign - PullRequest
9 голосов
/ 12 марта 2012

Возможно, это глупый вопрос, но есть ли причина использовать Math.Sign?

Есть ли скорость / оптимизация при использовании Math.Sign, а не просто при использовании оператора if?Может быть, просто предпочтение передовой практики / удобочитаемость кода?

if (rayDirX < 0) 
    stepX = -1; 
else 
    stepX = 1;

//----------

stepX = (rayDirX < 0) ? (-1) : (1);

//----------

stepX = Math.Sign(rayDirX);

Ответы [ 4 ]

4 голосов
/ 12 марта 2012

Существует функциональная разница: Math.Sign имеет три возможных возвращаемых значения и вернет ноль, если ввод равен 0. Вы не можете сделать это с (единственным) троичным оператором.

( Источник )

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

4 голосов
/ 12 марта 2012

Math.Sign может использоваться как часть большего выражения.Вы также можете получить знак для использования в выражении через троичный оператор, но не все думают, что тернарный оператор - это все, что можно прочитать.

3 голосов
/ 12 марта 2012

Я сомневаюсь, что есть функциональная разница или большая, если вообще таковая, разница в производительности, но версия Math.Sign немного более очевидна. Особенно в вашем примере, где Тип rayDirX не объявлен. Но это довольно тонко, и я бы не стал критиковать тебя за использование.

EDIT:

И еще одна вещь, в приведенном выше примере есть небольшая ошибка. В случае 0 Math.Sign вернет 0. Вот декомпилированный код вне фреймворка для Math.Sign:

public static int Sign(int value)
{
  if (value < 0)
  {
    return -1;
  }
  if (value > 0)
  {
    return 1;
  }
  return 0;
}
0 голосов
/ 12 марта 2012

Я думаю, что это в основном проблема читабельности.Я не видел ничего в ссылке, которая указывает на какие-либо различия.Но, как сказал Джоэл, Math.sign (rayDirX) гораздо проще использовать как часть большего выражения, чем блок if или условное выражение.

...