c# 在 class' 方法中访问结构成员

c# accessing struct members within class' methods

我正在尝试编写一个简单的游戏。我想设计一个 "movement controller" 对象,它可以处理来自引擎的移动指令。我还希望此对象公开一个方法,该方法将检查其状态和 return true/false 取决于它是否准备好移动。状态将保存为一组布尔变量。由于它们很多,我决定将它们组合在一个名为 "flags" 的新结构中。大致是这样的:

public class movContr
{
    int movId;
    public struct flags
    {
        bool isMoving;
        bool isLocked;
        bool isReady;
        (...)
    }

    public bool CheckReadiness()
    {
        if(flags.isReady==true) return true;
        return false;
    }
}

现在的问题是无法编译,错误是:

error CS0120: An object reference is required to access non-static member

违规行是:

if(flags.isReady==true) return true;

所以我猜 C# 不会像只包含顺序变量的内存 blob 那样对待结构,而是像 class.

的一些 "special" 表亲

这是我的问题:

我应该如何处理在其方法中访问结构 class 成员?我如何在 class 方法中引用其未来实例的成员?我试过这个:

if(this.flags.isReady==true) return true;

但我得到了同样的错误。

或者,如果使用 'struct' 封装我的标志变量不是正确的方法,那什么是?

我试图自己找到答案,但由于我能想到的所有关键字都非常通用,所以结果也是如此。大多数处理静态成员,这不是这里的解决方案,因为我需要 movContr class.

的多个独立实例

如异常所示,您需要创建 strike 的实例,如下所示:-

flags flag;
flag.isReady = true;

更多信息:-

http://www.dotnetperls.com/struct

Please notice how, in Main, the struct is created on the stack. No "new" keyword is used. It is used like a value type such as int.

顺便说一句,我建议您使用自动实现的属性而不是 Struck,如果这是您代码中显示的唯一用途

参考:- https://msdn.microsoft.com/en-us/library/bb384054.aspx

您已经创建了一个名为 flags 的结构声明。 但这只是声明,没有具体的价值。所以,片段

if(flags.isReady==true) return true;

尝试访问静态成员 (https://msdn.microsoft.com/en-us/library/98f28cdx.aspx)。

您需要声明该类型的变量才能使用它:

private flags myFlag;

public bool CheckReadiness()
{
     if(myFlag.isReady==true) return true;
      return false;
}

也许您的困惑来自 C++,其中 "inline, anonymous" 结构是允许的:

struct {
    int some_var
} flags;

flags.some_var = 1;

在 C# 中不可用

您不能使用 flags,因为您只是用 "struct flags" 声明了一个数据类型。您需要创建一个实例。

并且您应该将结构的字段声明为 public。否则你无法访问它们。

    int movId;

    // Delace fields as public
    public struct flags
    {
        public bool isMoving;
        public bool isLocked;
        public bool isReady;
    }

    // create a instance
    private flags myFlag;

    public bool CheckReadiness()
    {
        if(this.myFlag.isMoving == true) return true;
        return false;
    }

    // Better Implementation
    public bool CheckReadiness()
    {
        if (this.myFlag.isMoving) return true;
        return false;
    }

    // Best Implementation
    public bool CheckReadiness()
    {
        return (this.myFlag.isMoving);
    }

与其创建结构,不如创建属性更有意义。

public class movContr
{
    int movId;

    public bool IsMoving { get; set; }
    public bool IsLocked { get; set; }
    public bool IsReady { get; set; }
        (...)
}

那么不用调用 CheckReadiness 你只要调用 IsReady.

var temp = new movContr();
if(temp.IsReady)
{
    // It is ready.
}