从 PHP 迁移到 C#.如果函数没有有效结果,如何处理返回 FALSE


Moving from PHP to C#. How to handle returning FALSE if function has no valid result?

我正在从PHP背景学习C#。处理以下问题的正确方法是什么?

在 PHP 中,因为我们不受严格的 var 类型的约束,如果函数无法返回有效的结果,我们可以返回 FALSE,如下所示:

function hitPosition(){
    $offset = 10;
    if ( $this->hitPosition < 100 || is_int($this->hitPosition) ){
        return $this->hitPosition + offset;
    }
    return false;
}

但是,在 C# 中,我们无法这样做。如无效代码所示:

Vector3 MousePositionOnFloor(){
    Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);
    RaycastHit floorHit;
    if (Physics.Raycast (camRay, out floorHit, 100f, floorMask)) {
        return floorHit.point - transform.position;
    }
    return null;
}

注意:此处的代码仅用于说明问题。

这是PHP奇怪的约定引起的问题的典型例子(我知道,意见,但许多人都同意)。函数应该返回一个(基)类型,仅此而已。对于对象,总是可以返回null,但对于结构,情况就不同了。

有一些方法可以处理错误的情况。

  1. 异常。这在这里并不适用:不撞到地板并不例外,这是正常的预期事情。

  2. out/ref参数中返回值并返回成功布尔值。这也有点麻烦,如果函数只返回你问的内容,代码会更清晰。

  3. 已知对象。如果返回类型是一个对象,则可以使用在这种情况下返回的单例"null 对象"(如 DBNull 等),您可以与之进行比较。这不一定适用于结构,仅适用于对象。

  4. 已知值。我假设您的 Vector3 是浮点值,因此在没有命中时只返回坐标中的NaN值自然是最简单的。

所以第四个是合乎逻辑的:没有命中,没有数字可以给出。当然,如果你需要更多地区分为什么没有找到命中,你将需要更复杂的结构。但是由于这里只有三个选项——找到、未找到、异常——这很简单。

因此,如果没有找到结果(假设 XNA Vector3),只需return new Vector3(float.NaN)并在接收端if (float.IsNaN(vec.X)) ...以确定是否有有效结果。

Vector3 MousePositionOnFloor(){
Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit floorHit;
if (Physics.Raycast (camRay, out floorHit, 100f, floorMask)) {
    return floorHit.point - transform.position;
  }
    return null;
 }

好的,首先这一行 Vector3 MousePositionOnFloor() <-您甚至没有为此设置访问修饰符,因此这使其成为默认的私有,并且无法被游戏中具有脚本的其他类或其他对象访问。如果您确定希望此操作保持这种状态,请确保操作保留在该脚本中,否则尝试在外部访问它时会出现错误。

Vector3 MousePositionOnFloor() <-再次说它将返回一个Vector3,因此向量3需要具有3对浮点数X,Y,Z的值,但是这条线 return floorHit.point - transform.position; <- 是一个 Vector3,所以这应该是有效的。

return null <-这是一个主要问题。因为您说要返回 Vector3,但返回 null。至少将其更改为空白 Vector3 或在计算中不执行任何操作。无论你做什么,你都不能为 Vector3 返回 Null。因为您将获得空异常。

返回一个空白的 Vector3 是这样的return new Vector3(0,0,0); <- 请注意,添加了一个 0。原因 Unity3D Vector3 不允许 x y z 的值为空。原因变换位置是 Unity3d 中的绝对规则。任何对象都需要在游戏世界中具有变换位置。当我说任何对象时,我指的是任何游戏对象。这不包括组件。