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类实例。
答案 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.
}