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,如果这是您代码中显示的唯一用途
您已经创建了一个名为 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.
}
我正在尝试编写一个简单的游戏。我想设计一个 "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,如果这是您代码中显示的唯一用途
您已经创建了一个名为 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.
}