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 字段总是在更新,它会给我一些性能问题,任何人都可以向我解释原因和解决方案

在 C# 中创建基于可枚举数组的类

用 C 语言向函数解释变量声明

任何人都可以向我描述 Flutter 中 Material 和 MaterialApp 之间的区别,以及何时使用哪个?

是否可以在 C# 中限制公共枚举值?