在我的自定义函数中返回 double.NaN:这是一个好习惯吗?
Posted
技术标签:
【中文标题】在我的自定义函数中返回 double.NaN:这是一个好习惯吗?【英文标题】:Returning double.NaN in my custom function: is it a good practice? 【发布时间】:2019-01-18 04:19:21 【问题描述】:(关于返回 NaN 有一个类似的问题,但它没有回答这个问题)
我是一个初学者编码器(因此总是不确定什么是好的做法)并且我正在编写一种方法来计算在 2d 空间中移动的某些对象的方向角(这是为了 Codingame 挑战)。为此,我写了一个方法
public static double GetAngle(double deltaX, double deltaY)
if (deltaX==0 && deltaY==0) return double.NaN; //if not moving the direction is undefined
//...
//calculations etc
return result;
这样返回 NaN 是一种好习惯吗?看起来方便且合乎逻辑(物体不动,因此没有速度,因此没有速度矢量),但不知何故,我觉得当这种方法用于其他计算时,它可能会导致以后很难发现一些错误(当然我会使用NaN 检查我记得但仍然存在的地方)。如有必要,此方法可以返回 0 而不是 NaN,我可以接受。
【问题讨论】:
你可以使用类似于 NETTryParse
方法并返回一个布尔值
谢谢,我会读到的。虽然我认为一个函数不应该根据条件返回两种不同的类型(如果我理解你的话)。
Int32.TryParse Method 微软认为还可以
我一定是误会了,我以为你的意思是让我在函数的 return 语句中放置一个 TryParse,这样它通常会返回一个双精度值,有时是一个布尔值。
不,更像是使用它作为模式:bool TryGetAngle(double X, double Y, out double angle)
【参考方案1】:
虽然在某些方面它是合乎逻辑的,但我建议更惯用的方法是使用Nullable<double>
,也写为double?
:
public static double? GetAngle(double deltaX, double deltaY)
if (deltaX == 0 && deltaY == 0)
return null;
// ...
// Calculations etc
return result;
这可能更符合您对其他代码表示“非结果”的方式。
除此之外,返回类型是 double?
而不是 double
的事实将迫使调用者考虑无结果选项 - 而调用返回 NaN 并最终传播的方法非常容易其他地方的 NaN 值是意外的。
【讨论】:
“除此之外” => 可能是这样使用它的原因, 哦!我没有那样想。我之前读到双精度数不能为空,所以我认为我应该使用 NaN(我认为这是对这些东西的空替换)。谢谢!【参考方案2】:如果没有找到结果,我经常返回 null,并坚持始终使用 null。如果你不能在这里返回 null 然后使用 double.NaN
【讨论】:
谢谢,这是我在了解不可为空类型之前的意图。我认为是双倍的? Daisy Shipton 的建议在这里非常有效。以上是关于在我的自定义函数中返回 double.NaN:这是一个好习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章