[英]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,如果这是代码中所示的唯一用途
您不能使用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.