方法访问方法混乱

时间:2018-07-20 02:44:14

标签: c# monogame

我在将Monogame用于C#,并且发现一行代码使我感到困惑。

    if (Keyboard.GetState().IsKeyDown(Keys.W))
        {

        }

好吧,以我的理解,“ Keyboard”是类,而“ GetState()”是“ Keyboard”类中的方法。但是,方法“ GetState()”如何访问 “ IsKeyDown(Keys.W)”这似乎是另一种方法。一个方法如何使用点运算符访问另一个方法。

1 个答案:

答案 0 :(得分:2)

如注释中所述,这只是方法链接的一种情况。使用一个方法的结果调用下一个方法,依此类推。

要使其非常清晰,让我们将代码分开看一下是怎么回事。

var keyboardState = Keyboard.GetState();

if (keyboardState.IsKeyDown(Keys.W))
{
}

实际上,这里发生了很多事情。在MonoGame中,Keyboard类是静态的,因此可以从任何地方调用其方法。当您调用GetState()时,它将返回KeyboardState类的实例,该实例保存了在调用方法时键状态的副本。

IsKeyDown方法返回一个bool,这就是为什么可以在if语句中使用它来检查键是否真正按下的原因。

希望将原始代码与分解后的代码进行比较,您将看到如何在各种情况下使用方法链接。有时,这样分解代码会使代码更易于理解,而有时,将多个链接方法结合在一起也很容易理解(您通常会在LINQ代码中找到它)。

但是,这里有一个重要的区别。当您想一次检查多个按键组合时会发生什么?这段代码:

if (Keyboard.GetState().IsKeyDown(Keys.W))
{
}

if (Keyboard.GetState().IsKeyDown(Keys.S))
{
}

实际上与以下代码不同:

var keyboardState = Keyboard.GetState();

if (keyboardState.IsKeyDown(Keys.W))
{
}

if (keyboardState.IsKeyDown(Keys.S))
{
}

原因是,每次调用该方法时,调用Keyboard.GetState()确实可以获取键盘状态。从技术上讲,这意味着在调用GetState之间,按键状态可能已更改。

在大多数情况下,这并不重要,因为代码执行得足够快,因此不会引起注意。但是了解这一区别很重要,因为我已经看到了在代码的两个不同部分调用GetState时会出现一些奇怪的错误的情况。特别是如果您持有“先前状态”的副本以检查关键帧之间的状态是否已更改。

因此,即使您可以这样的方法链,在这种情况下我也不推荐使用。如果每帧只调用一次GetState,并在整个游戏代码中重复使用该状态,那么您的头痛将大大减轻。