C# 在我的自定义函数中返回double.NaN:这是一种好的做法吗?

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

(关于返回NaN有一个类似的问题,但它没有回答这个问题)

我是一名初学者(因此总是不确定什么是好的做法),我正在编写一种方法,用于计算在2d空间中移动的某个对象的方向角(这是用于编码名称挑战)。为此,我编写了一个方法

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

您可以使用类似于NET
TryParse
的方法并返回boolThanks,我将阅读相关内容。尽管我认为函数不应该根据条件返回两种不同的类型(如果我理解正确的话)。微软认为这是好的,我一定误解了,我以为你是想让我在函数的返回语句中放一个TryParse,这样它通常会返回一个double,有时是一个boolean。不,更像是将其用作模式:
bool TryGetAngle(双X,双Y,out双角度)
您可以使用类似于NET
TryParse
的方法并返回boolThanks,我将阅读相关内容。尽管我认为函数不应该根据条件返回两种不同的类型(如果我理解正确的话)。微软认为这是好的,我一定误解了,我以为你是想让我在函数的返回语句中放一个TryParse,这样它通常会返回一个double,有时是一个boolean。不,更像是将其用作一种模式:
bool TryGetAngle(双X,双Y,out双角度)
“除了其他任何东西”=>可能是这样使用它的原因,哦!我不是那样想的。我以前读到double是不可为null的,所以我想我应该使用NaN(我认为,它是这种东西的一种null替换)。非常感谢。“除此之外”=>可能是这样使用它的原因,哦!我不是那样想的。我以前读到double是不可为null的,所以我想我应该使用NaN(我认为,它是这种东西的一种null替换)。非常感谢。谢谢,这是我在学习不可空类型之前的意图。我想是双份的?根据Daisy Shipton的建议,在这里可以理想地工作。谢谢,这是我在学习不可空类型之前的意图。我想是双份的?根据黛西·希普顿的建议,在这里最理想。