c#访问类内的结构成员';方法
我想写一个简单的游戏。我想设计一个“移动控制器”对象,它将处理来自引擎的移动指令。我还想让这个对象公开一个方法,该方法将检查其状态并返回true/false,这取决于它是否准备好移动。状态将另存为一组布尔变量。由于它们很多,我决定将它们组合在一个名为“flags”的新结构中。大致上是这样的:c#访问类内的结构成员';方法,c#,struct,member,non-static,C#,Struct,Member,Non Static,我想写一个简单的游戏。我想设计一个“移动控制器”对象,它将处理来自引擎的移动指令。我还想让这个对象公开一个方法,该方法将检查其状态并返回true/false,这取决于它是否准备好移动。状态将另存为一组布尔变量。由于它们很多,我决定将它们组合在一个名为“flags”的新结构中。大致上是这样的: public class movContr { int movId; public struct flags { bool isMoving; boo
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#不会把结构当作只包含顺序变量的内存块,而是像类的“特殊”表亲一样
以下是我的问题:
我应该如何处理在其方法中访问结构类成员?如何将类内方法引用到其未来实例的成员?我试过这样做:
if(this.flags.isReady==true) return true;
但我也犯了同样的错误
或者,如果使用“struct”封装我的标志变量不是一种正确的方法,那么是什么呢
我自己也试图找到答案,但由于我能想到的所有关键词都非常通用,所以结果也是如此。大多数都处理静态成员,这在这里不是一个解决方案,因为我需要多个独立的movContr类实例。作为例外,您需要创建Stroked的实例,如下所示:-
flags flag;
flag.isReady = true;
有关更多信息:-
请注意,主要是如何在堆栈上创建结构的。
没有使用“新”关键字。它与int等值类型一样使用
顺便说一下,如果这是代码中显示的唯一用法,我建议您使用自动实现的属性,而不是strick
Ref:-您已经创建了一个名为
flags
的结构声明。
但这只是宣告,不是具体的价值。那么,这个片段
if(flags.isReady==true) return true;
尝试访问静态成员()
您需要声明该类型的变量才能使用它:
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#中不可用。您不能使用
标志,因为您只声明带有“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; }
(...)
}
然后,您不需要调用checkready
,只需调用IsReady
var temp = new movContr();
if(temp.IsReady)
{
// It is ready.
}
我不确定你是否需要一个结构。看起来您可以在类中为该结构中的每个字段创建属性或字段。真不敢相信这么简单,抱歉,我不能接受多个答案:(有些日子我觉得我应该坚持使用汇编程序,我发誓@juharr,因为这是一个非常早期的阶段,我的记忆力非常差,我想让它尽可能可读,以防我需要从项目中休息一下。它不需要是struct,但我想以类似于movContrObj.flags.isMoving的方式来处理这些标志,至少就目前而言,我个人觉得在这里使用struct的可读性较差,但如果您对它比较熟悉,那么就不会有任何真正的伤害。这现在是有意义的,但稍后检查就绪情况可能会对CPU造成很大的负担,而且我需要缓存值,因此它不会被执行,而且overAuto属性只是一个简单的问题将getter和setter方法的指针ort到备份字段。不确定这将如何增加CPU上的负载,而不是从结构返回值的方法。在这两种情况下,访问的值都在堆栈中。我的意思是,现在检查就绪()只检查isReady的值,但希望在不久的将来它也会包括一些复杂的计算只有当我真的必须这样做时,它的结果才会缓存在isReady中,以备以后便宜的访问。我来自较低级别的背景,使用诸如运算符重载之类的东西有时仍会让我的脚踝肿胀:)也就是说,如果我能解决所有的怪癖,像C#这样的语言似乎是编写游戏脚本的完美选择(但不确定它如何在性能方面发挥作用)