C# 新手,任何人都可以向我解释枚举和设置变量的工作原理吗? [关闭]
Posted
技术标签:
【中文标题】C# 新手,任何人都可以向我解释枚举和设置变量的工作原理吗? [关闭]【英文标题】:New to C#, can anyone explain to me how enums and setting variables for enums works? [closed] 【发布时间】:2017-03-29 19:25:44 【问题描述】:我确定这是一个非常简单的问题,但我正在学习如何用 C# 编程,这个文本冒险程序的“流程”对我来说非常有意义,但我很困惑第三行“私人国家 myState;"作品。
如您所见,程序首先将变量 myState 设置为 States.cell,它调用了一个 void 方法(下面未显示),该方法等待更改变量“myState”的键,从而更新更新函数。
我的问题是,“枚举”类是如何工作的?似乎可以从“枚举状态”行中创建一个变量,但我不明白为什么会这样。对不起,如果这是一个非常愚蠢的问题。
代码如下:
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();
【问题讨论】:
枚举只是保存一系列常量值,从 0 开始,除非您为每个值定义了要使用的数字。另外我可以告诉您,您正在学习 Udemy 的 Unity 课程。 您是否考虑过查看 relevant documentation 关于此 C# 功能的内容? 对不起,让我澄清一下。我了解枚举是什么以及它们的目的,我只是不明白您如何获取枚举列表并显然从中创建一个变量(从“私有枚举状态”到“私有状态 myState”)。 是的,我正在参加关于 udemy 的统一课程,这真的很有趣!private States myState
所做的是声明一个名为“myState”的States
类型的变量(您定义的枚举基本上是一个类型)。因此,您可以将States
的任何可能值存储在您的myState
变量中。
【参考方案1】:
枚举基本上是一种特殊类型,可让您定义命名值。您正在创建一个命名类型,就像您定义一个类一样。您的代码实际上在做的是首先使用所有可能的命名值定义名为 States 的枚举类型,然后使用您在前一行中定义的枚举类型“States”声明一个变量“myState”。您在代码中看不到的是,默认情况下,在 c# 中,您的枚举的基础类型是整数,并且每个可能的值也都有一个分配给它的整数值,如果需要可以覆盖它,所以所有你在您的更新代码中真正做的是整数比较。你有什么理由不使用开关而不是那个大的 if/else 块?你也可以去掉 start 函数,像这样实例化你的 myState 变量:
private States myState = States.cell;
MSDN 在这里有很好的文档:
https://msdn.microsoft.com/en-us/library/sbbt4032.aspx
【讨论】:
非常感谢。这是完美的解释,现在说得通了。我只是不明白这背后的基本功能。大多数类型是否有特殊之处,它们既可以用作类,也可以用作可以在变量格式中设置的东西?我使用大 if/else 块的唯一原因是我是个白痴,并且试图学习如何编程,这就是我目前所知道的全部! 我可能会错过一个,但有一些类型是这样工作的:类(显然)、枚举、接口、委托和事件是我能想到的我的头顶是这样工作的。 结构! struct 是我错过的那个。【参考方案2】:默认枚举是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();
【讨论】:
这太棒了!太感谢了。但是,让我澄清一下,我确实了解枚举的目的和用途以及它们是如何运作的,我不明白的是你如何显然可以从枚举列表中创建一个变量(从“私有枚举状态”到“私有状态”我的国家”)。这对任何课程都可能吗?在 C# 文档中,他们提到您可以从枚举中创建变量,但不要对此进行扩展。 您可能希望将枚举视为常量的集合。是的,您可以将类属性声明为枚举,实际上我一直在使用我的 MVC 模型类。使用枚举的价值在于使您的代码更易于阅读,而不是记住类属性 ex: user.country = 1 表示 USA user.country = Country.Usa 是不言自明的。【参考方案3】:很简单: 这一行的建议:
private enum States cell, sheets_0, mirror, lock_0, sheets_1, cell_mirror, lock_1, freedom;
就是定义一个名为“States”的枚举
后面一行的意思:
private States myState;
就是创建一个名为“my state”的“State”类型的实例
【讨论】:
以上是关于C# 新手,任何人都可以向我解释枚举和设置变量的工作原理吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
任何人都可以向我解释CMVideoFormatDescriptionGetCleanAperture()吗?
当我运行迁移时,uuid 字段总是在更新,它会给我一些性能问题,任何人都可以向我解释原因和解决方案