[英]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.