Вопрос о назначении C # - PullRequest
       23

Вопрос о назначении C #

4 голосов
/ 20 сентября 2010

В следующем фрагменте:

long frameRate = (long)(_frameCounter / this._stopwatch.Elapsed.TotalSeconds);

Почему справа от оператора присваивания есть дополнительный (long) (...)?

Ответы [ 4 ]

4 голосов
/ 20 сентября 2010

При делении создается значение с плавающей запятой двойной точности (поскольку TimeSpan.TotalSeconds равно double), поэтому приведение обрезает результирующее значение до целого, а не с плавающей запятой. Вы получите приблизительное, но целое число кадров в секунду вместо точного ответа с дробными кадрами в секунду.

Если frameRate используется для отображения или регистрации, приведение может просто сделать вывод более приятным.

2 голосов
/ 20 сентября 2010

Это явное преобразование (приведение), которое преобразует результат операции деления в long.

См .: Преобразование типов и типов

0 голосов
/ 20 сентября 2010

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

  1. По крайней мере один из типов в выражении не является целочисленным типом (я так не думаю).
  2. Разработчик хотел подчеркнуть, что результат имеет тип long (делает тип результата понятным для читателя - веская причина).
  3. Разработчик не был уверен, что является результатом выражения, и хотел убедиться, что он будет long (лучше убедиться, что он надеется, что он будет работать).

Полагаю, это было 3:).

0 голосов
/ 20 сентября 2010

Поскольку результат расчета относится к типам переменных, которые используются. Если компилятор считает, что тип результата не является long из-за используемых типов, то вам нужно привести ваш результат.

Обратите внимание, что приведение вашего результата может повлечь потерю точности или значений. Приведение в скобках (long) является явным приведением и не будет генерировать никаких ошибок, если, скажем, вы попытались вписать «1.234» в long, который может хранить только «1».

...