我确信这是一个非常简单的问题,但我正在学习如何用 C# 进行编程,这个文本冒险程序的“流程”对我来说非常有意义,但我很困惑第三行“私有状态”如何我的州;”有效。
如您所见,程序首先将变量 myState 设置为 States.cell,它调用一个 void 方法(下面未显示),该方法等待更改变量“myState”的键,从而更新更新函数。
我的问题是,“enum”类是如何工作的?似乎可以从“enum States”行创建一个变量,但我不明白为什么会这样。抱歉,如果这是一个非常愚蠢的问题。
这是代码:
public Text text;
private enum States {cell, sheets_0, mirror, lock_0, sheets_1, cell_mirror, lock_1, freedom};
private States myState;
// Use this for initialization
void Start () {
myState = States.cell;
}
// Update is called once per frame
void Update () {
print (myState);
if (myState == States.cell){ state_cell();}
else if (myState == States.sheets_0){ state_sheets_0();}
else if (myState == States.mirror){ state_mirror();}
else if (myState == States.lock_0){ state_lock_0();}
else if (myState == States.sheets_1){ state_sheets_1();}
else if (myState == States.cell_mirror){ state_cell_mirror();}
else if (myState == States.lock_1){ state_lock_1();}
else if (myState == States.freedom){ state_freedom();}
}
枚举基本上是一种特殊类型,可让您定义命名值。您正在创建命名类型,就像定义类一样。您的代码实际上所做的是首先使用所有可能的命名值定义名为 States 的枚举类型,然后使用您在之前的行中定义的枚举类型“States”声明变量“myState”。您在代码中看不到的是,默认情况下,在 c# 中,枚举的基础类型是整数,并且每个可能的值也分配有一个整数值,如果需要,可以覆盖该值,所以您所有的在更新代码中真正做的是整数比较。你有什么理由不使用 switch 而不是那个大的 if/else 块吗?您也可以消除启动函数并像这样实例化您的 myState 变量:
private States myState = States.cell;
MSDN 这里有很好的文档:
默认枚举是 int 值,但也可以转换为其他类型
public enum MyEnum : byte
{
One = 1,
Two = 2
}
如果您打算使用关联值作为基础类型,则需要对其进行强制转换
var myByte = (byte)MyEnum.Two;
根据您的示例,您应该使用 switch 语句而不是多个 if 语句,这样更具可读性:
var enumValue = MyEnum.One;
switch (enumValue)
{
case MyEnum.One:
//Do Something here.
break;
case MyEnum.Two:
//Do something else here.
break;
default:
throw new ArgumentOutOfRangeException();
}
非常简单:
此行的目的:
private enum States {cell, sheets_0, mirror, lock_0, sheets_1, cell_mirror, lock_1, freedom};
是定义一个名为“States”的枚举
其后一行的目的:
private States myState;
是创建一个“State”类型的实例,名为“my state”