c#访问类中的结构成员'方法

时间:2015-05-06 11:34:27

标签: c# struct member non-static

我试图写一个简单的游戏。我想设计一个"运动控制器"对象,它将处理来自引擎的移动指令。我还希望这个对象公开一个方法,它会检查它的状态并返回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这样只包含变量的结构,而是像某些"特殊"一堂课的堂兄。

以下是我的问题:

我应该如何处理其方法中的struct class成员?如何在类方法中引用其未来实例的成员?我尝试了这个:

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

但我得到同样的错误。

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

我试图自己找到答案,但由于我能提出的所有关键字都非常通用,结果也是如此。大多数处理静态成员,这不是解决方案,因为我需要多个独立的movContr类实例。

4 个答案:

答案 0 :(得分:2)

您已经创建了一个名为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 ++,其中允许使用“内联,匿名”结构:

struct {
    int some_var
} flags;

flags.some_var = 1;

在C#中不可用

答案 1 :(得分:0)

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

flags flag;
flag.isReady = true;

有关更多信息: -

http://www.dotnetperls.com/struct

  

请注意,在Main中,如何在堆栈上创建结构。   不,#34;新"使用关键字。它的使用方式类似于int。

等值

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

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

答案 2 :(得分:0)

您不能使用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);
    }

答案 3 :(得分:0)

不是创建结构,而是拥有属性可能更有意义。

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.
}