繁体   English   中英

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

[英]c# accessing struct members within class' methods

我正在尝试编写一个简单的游戏。 我想设计一个“运动控制器”对象,该对象将处理来自引擎的运动指令。 我还希望该对象公开一个方法,该方法将检查其状态并根据是否准备移动来返回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那样仅按顺序包含变量的结构,而是像某个类的“特殊”表亲那样对待结构。

这是我的问题:

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

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

但我得到同样的错误。

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

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

您已经创建了一个称为flags的结构声明。 但这仅仅是声明,而不是具体的价值。 因此,摘要

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

尝试访问静态成员( https://msdn.microsoft.com/zh-cn/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#中不可用

作为例外提示,您需要创建被触击的实例,如下所示:-

flags flag;
flag.isReady = true;

欲获得更多信息 :-

http://www.dotnetperls.com/struct

请注意在Main中如何在堆栈上创建结构。 没有使用“新”关键字。 像值类型(如int)一样使用它。

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

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

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

然后,只需调用IsReady而不是调用CheckReadiness即可。

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

暂无
暂无

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

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