C# 在我的自定义函数中返回double.NaN:这是一种好的做法吗?
(关于返回NaN有一个类似的问题,但它没有回答这个问题) 我是一名初学者(因此总是不确定什么是好的做法),我正在编写一种方法,用于计算在2d空间中移动的某个对象的方向角(这是用于编码名称挑战)。为此,我编写了一个方法C# 在我的自定义函数中返回double.NaN:这是一种好的做法吗?,c#,floating-point,nan,C#,Floating Point,Nan,(关于返回NaN有一个类似的问题,但它没有回答这个问题) 我是一名初学者(因此总是不确定什么是好的做法),我正在编写一种方法,用于计算在2d空间中移动的某个对象的方向角(这是用于编码名称挑战)。为此,我编写了一个方法 public static double GetAngle(double deltaX, double deltaY) { if (deltaX==0 && deltaY==0) return double.NaN; //if not moving the
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,我可以接受。虽然在某些方面它是合乎逻辑的,但我建议更惯用的方法是使用
可空的,也可以写成双精度?
:
public static double? GetAngle(double deltaX, double deltaY)
{
if (deltaX == 0 && deltaY == 0)
{
return null;
}
// ...
// Calculations etc
return result;
}
这可能更符合您对其他代码表达“非结果”的方式
除此之外,返回类型是double?
而不是double
这一事实将迫使调用者考虑无结果选项——然而调用返回NaN的方法并最终意外地将NaN值传播到其他地方是非常容易的。虽然在某些方面它是合乎逻辑的,我建议更惯用的方法是使用Nullable
,也可以写成double?
:
public static double? GetAngle(double deltaX, double deltaY)
{
if (deltaX == 0 && deltaY == 0)
{
return null;
}
// ...
// Calculations etc
return result;
}
这可能更符合您对其他代码表达“非结果”的方式
除此之外,返回类型是double?
而不是double
这一事实将迫使调用者考虑无结果选项——然而调用返回NaN的方法并最终意外地将NaN值传播到其他地方是非常容易的。如果找不到结果,我通常会返回null,并坚持始终使用null。如果您不能在此处返回null,请使用double.NaN如果找不到结果,我通常会返回null,并坚持始终使用null。如果您不能在这里返回null,那么使用double.NaN您可以使用类似于NETTryParse
的方法并返回boolThanks,我将阅读相关内容。尽管我认为函数不应该根据条件返回两种不同的类型(如果我理解正确的话)。微软认为这是好的,我一定误解了,我以为你是想让我在函数的返回语句中放一个TryParse,这样它通常会返回一个double,有时是一个boolean。不,更像是将其用作模式:bool TryGetAngle(双X,双Y,out双角度)
您可以使用类似于NETTryParse
的方法并返回boolThanks,我将阅读相关内容。尽管我认为函数不应该根据条件返回两种不同的类型(如果我理解正确的话)。微软认为这是好的,我一定误解了,我以为你是想让我在函数的返回语句中放一个TryParse,这样它通常会返回一个double,有时是一个boolean。不,更像是将其用作一种模式:bool TryGetAngle(双X,双Y,out双角度)
“除了其他任何东西”=>可能是这样使用它的原因,哦!我不是那样想的。我以前读到double是不可为null的,所以我想我应该使用NaN(我认为,它是这种东西的一种null替换)。非常感谢。“除此之外”=>可能是这样使用它的原因,哦!我不是那样想的。我以前读到double是不可为null的,所以我想我应该使用NaN(我认为,它是这种东西的一种null替换)。非常感谢。谢谢,这是我在学习不可空类型之前的意图。我想是双份的?根据Daisy Shipton的建议,在这里可以理想地工作。谢谢,这是我在学习不可空类型之前的意图。我想是双份的?根据黛西·希普顿的建议,在这里最理想。