枚举的主要用途是什么?

26

在C#中,枚举的主要用途是用于定义一组命名的常量值。它们简化了代码,并使得代码更加易懂和可读。

编辑: 假设我想将字符串变量与任何枚举项进行比较,那么我该如何在C#中实现?

10个回答

51

可以从MSDN开始了解枚举类型(也称为“枚举”或“enum”),它提供了一种定义一组命名整数常量并分配给变量的有效方式。

枚举类型(也称为枚举或enum)提供了一种有效的方法,用于定义一组命名整数常量,这些常量可以分配给变量。

其主要好处是常量可以以一致、表达清晰和类型安全的方式进行引用。

以这个非常简单的Employee类为例,它有一个构造函数:

你可以像这样做:

public class Employee
{
    private string _sex;

    public Employee(string sex)
    {
       _sex = sex;
    }
}

但是现在你是依赖于用户输入恰好正确的字符串值。

使用枚举,你可以有:

public enum Sex
{
    Male = 10,
    Female = 20
}

public class Employee
{
    private Sex _sex;

    public Employee(Sex sex)
    {
       _sex = sex;
    }
}    

这突然使得 Employee 类的使用者能够更加轻松地使用它:

Employee employee = new Employee("Male");
成为:

变成:

Employee employee = new Employee(Sex.Male);

2
+1 认为应该是新员工 - Mina Gabriel
8
@MinaGabriel 哈哈谢谢!大约三年前发生的事情,但还是让我有点尴尬。 - David Hall
我最近学习了枚举类型。一直在思考它的实际应用。这是其中一个实用的例子。 - Unnikrishnan
2
我仍然无法理解为什么在枚举内部分配int值给数据。 - vigamage
2
默认情况下,枚举将为枚举列表中的任何内容分配整数值,从0开始。您可以通过断言元素是特定的整数值来覆盖此行为。您可以通过执行(int)Sex.Male或(int)Sex.Female来查看这一点。 - DForck42
那么这个想法是让使用Employee构造函数更安全?我们将使用枚举类型而不是字符串,这种情况下将其分配为10的int值。 - carloswm85

26

在IT技术方面,常常会遇到需要用整数表示若干离散状态的数据或分类信息。典型的例子是月份,我们希望既能用字符串表示月份(例如“2010年8月19日”),也能用数字表示(例如“8/19/2010”)。枚举提供了一种简洁的方式来为一组整数赋予名称,因此我们可以使用简单的循环遍历这些整数,以便处理月份信息。


使用案例的解释非常清晰明了。 - carloswm85

11

枚举是强类型常量。枚举是具有特定名称的一组特殊值,每个值都映射到一组数字,通常是整数。当您希望能够在一组常量值之间进行选择,并且每个可能的值都与一个数字相关联时,它们非常有用,并且可以在各种情况下使用。正如您将在我们的示例中看到的那样,枚举是在类上面、命名空间内定义的。这意味着我们可以在同一命名空间内的所有类中使用枚举。

using System;

namespace ConsoleApplication1
{
    public enum Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

    class Program
    {
        static void Main(string[] args)
        {
            Days day = Days.Monday;
            Console.WriteLine((int)day);
            Console.ReadLine();
        }
    }
}

6

枚举(Enum)是一种变量类型。我们可以在C、C#和许多其他语言中找到这种变量类型。 Enum的基本思想是,如果我们有一组整数类型的变量(默认情况下),则可以使用Enum而不是使用太多int值。这是一种高效的方式。例如,您想要编写彩虹颜色,则可以像这样编写:

const int Red = 1;
const int Orange = 2;
const int Yellow = 3;
const int Green = 4;
const int Blue = 5;
const int Indigo = 6;
const int Violet = 7;

在这里,您可以看到有太多的整数声明。如果您或者您的程序错误地更改了任何整数变量的值,例如将Violet = 115而不是7,则很难进行调试。

因此,枚举出现了。您可以为任何整数类型的变量组定义枚举。对于枚举,您可以像这样编写代码:

enum rainBowColors
{
 red=1,
 orange=2,
 yellow=3,
 green,
 blue=8,
 indigo=8,
 violet=16) 
}; 

rainBowColors是一种类型,只有相同类型的其他变量才能分配给它。在C#/ C ++中,您需要进行类型转换,而在C中则不需要进行类型转换。

现在,如果您想声明一个rainBowColors类型的变量,则在C中

enum rainBowColors variableOne = red;

在 C# / C++ 中,您可以这样做:

rainBowColors variableOne = red;

那么,variableOne 的值将是整数 1 吗? - carloswm85

4

在C#中,枚举有两个含义。

枚举(名词)是一组命名的值。例如:

public enum Result {
  True,
  False,
  FileNotFound
}

枚举(enumerate 的名词形式)是指逐个遍历集合中的项。

IEnumerable<T> 接口用于提供可枚举能力的类。数组是这样一个简单示例的类。另一个示例是 LINQ 如何使用它返回可枚举集合作为结果。

编辑:

如果要将字符串与枚举值进行比较,则必须将字符串解析为枚举类型:

if ((Result)Enum.Parse(typeof(Result), theString) == Result.True) ...

或将枚举值转换为字符串:
if (theString == Result.True.ToString()) ...

注意在比较值时,要根据是否需要大小写匹配来进行比较。

如果您想枚举集合并查找字符串,则可以使用 foreach 命令:

foreach (string s in theCollection) {
  if (s == theString) {
    // found
  }
}

如果 ((Result)Enum.Parse(Result, theString) == Result.True),则进行以下更正:根据我的了解,应该改为:if ((Result)Enum.Parse(typeof(Result), theString) == Result.True) - Red Swan
无论如何,哪种方法在性能方面最好?是第一种(解析方法)比较好还是第二种? - Red Swan
@Lalit:谢谢,我进行了更正。我认为性能应该基本相同。将枚举转换为字符串可能会更快,但另一方面,与枚举值相比较字符串时较慢。 - Guffa

4

使用Enum的另一个优点是,如果需要更改任何整数值,则只需更改Enum定义即可避免在所有地方更改代码。


3

2

枚举(ENUM)

枚举是一个值类型,具有一组相关的命名常量,通常称为枚举器列表。使用enum关键字声明枚举。它是用户定义的基本数据类型。

枚举类型可以是整数(float、int、byte、double等)。但如果除int之外的类型,则需要进行强制转换。

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

0

让我们举个例子,我们在类中使用普通常量,如 int a=10;

如果我们不小心在同一类中为该变量分配新值,例如 a=20; 那么当我们想要访问它们时,我们将得到错误的数据。 枚举提供了安全访问常量的方式。

此外,如果我们在一个类中有许多字段常量,我们必须记住它们才能在类中使用。 但是,枚举包含一组相关名称常量,如果我们想要访问常量,只需要记住枚举名称即可。


0

在我的经验中,枚举类型只适用于非常特定的情况,并且应该仅在您绝对需要在应用程序中维护此内容时使用。当您与多个开发人员一起工作并且某个新开发人员加入项目并向应用程序添加枚举类型时,问题就会出现,没有错误,一切都构建完成,但是您还有另一个全栈开发人员以不同的顺序在查找表中维护相同的列表。

砰!!!

即使不是故意的,也会因此遭受太多次的打击。经验法则是,在应用程序中不要维护超过5或6个枚举类型。如果更高,最好将它们存储在您选择的数据库的查找表中。


你能否添加一个具有数据的实际示例来说明你在这里说的内容? - carloswm85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接