繁体   English   中英

关于在 2d Platformer 项目的 C# 代码中使用 Get Accessor 而不是 if 语句的问题

[英]Question about the usage of a Get Accessor instead of an if statement in C# code for 2d Platformer project

我是 C# 的初学者,我最近从 Github 下载了一个 Unity 2D 平台游戏项目。 我试图了解玩家游戏 object 项目文件中的一些编码,因为我有兴趣了解游戏中的物理是如何创建的。 我试图理解的当前代码如下所示:

public float standingHeight = 40f;
public float ballHeight = 30f;

private float heightHalf
{
    get
    {
        if (rolling || jumped) { return ballHeight / 2f; }
        else { return standingHeight / 2f; }
    }
}

我试图了解变量 heightHalf 试图做什么。 如果我没记错的话,这个变量似乎有一个“获取访问器”。 我是否认为代码是说如果玩家游戏 object 正在跳跃或滚动,它将返回 ballHeight 变量除以“2f”? 否则将返回standingHeight 的值除以“2f”?

这是否意味着变量 heightHalf 将根据上一段中提到的两个计算中的任何一个被分配一个值? 我能问一下为什么使用“获取访问器”而不是 if 语句吗? 例如:

if (rolling || jumped) { 
heightHalf = ballHeight / 2f;
}else{
heightHalf =  standingHeight / 2f;
}

很好理解它。 是的,它完全按照您的描述进行。

就个人而言,我认为没有首选的方法。 如果您熟悉 Java,他们没有 get/set 访问器。 您只能使用公共属性或创建 get()/set(object value) 方法。

C# 让您可以更好地控制如何使用属性。

正如我从获取 heightHalf 值的上下文中看到的那样,有些东西需要这个属性来改变大小,好吧,我猜是对撞机?

您可以通过 get/set 属性或名为 getHeightHalf() 的方法来完成。

但是,代替面向 object 的原则,您可以说 object 的所有方法都可以指定为操作。 即:处理玩家的 class 可以具有 Jump()、Move()、Attack() 功能。

Get/Set 访问器提供这些操作所需的值,因此 heightHalf 逻辑放置在属性而不是方法上。

如果我没记错的话,这个变量似乎有一个“获取访问器”。

这并不完全正确。 heightHalf不是变量,它是只读属性。 并且只读属性是通过仅具有“获取访问器”来定义的。

我是否认为代码是说如果玩家游戏 object 正在跳跃或滚动,它将返回 ballHeight 变量除以“2f”? 否则将返回standingHeight 的值除以“2f”?

是的,是的。

这是否意味着变量 heightHalf 将根据上一段中提到的两个计算中的任何一个被分配一个值?

同样,不是变量,但属性的值与您描述的一样。

我能问一下为什么使用“获取访问器”而不是 if 语句吗?

好吧,使用if语句的 get 访问器。 如果我们删除了 get 访问器,您必须将属性转换为方法。 以下是两种合法的 C# 写法:

(1) 只读属性

private float heightHalf
{
    get
    {
        if (rolling || jumped)
        {
            return ballHeight / 2f;
        }
        else
        {
            return standingHeight / 2f;
        }
    }
}

(2) 方法

private float heightHalf()
{
    if (rolling || jumped)
    {
        return ballHeight / 2f;
    }
    else
    {
        return standingHeight / 2f;
    }
}

只读属性是 C# 中执行此操作的典型方式。 该方法是 Java 通常会执行此操作的方式。

当值来自 object 的内部 state 时,C# 通常会使用属性。 如果存在影响 output 的输入参数,即 function,将使用一种方法。

就个人而言,如果我正在编写这段代码,我会使用 go :

private float heightHalf => ((rolling || jumped) ? ballHeight : standingHeight) / 2f;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM