枚举的意义是什么?

8

当枚举需要转换为整数时,使用枚举在switch语句中有何意义?

使用一些const int是否更好?我想使用枚举,但是强制转换使它们看起来笨重。我以为它们应该是int类型,但它们是其他什么东西吗?

C ++中它们的行为相同吗?

对不起,我的问题表述得不好,我的大脑已经崩溃了。


10
你的大脑可能比你想象的更加疲劳……在switch语句中使用枚举时,不需要将其转换。 - Adam Houldsworth
2
在C#中,您不需要在switch命令中将枚举强制转换为int类型...无论如何,记住枚举(我们心中的名称)比记住整数值要容易得多,您认为呢? - Marco
你在这里做过一点搜索吗?我相信你会看到很多关于它的使用的帖子。 - Zenwalker
10个回答

19

枚举的整个目的就是使您的代码更易读。它们没有转换为 int,因为它们默认就是 int。唯一的区别是,您不必来回检查可能拥有的 int 值,而是可以使用一组明确的枚举来使代码更易读。


3
它们不一定是“int”,尽管默认情况下它们是。这是关于C#的讨论。 - Adam Houldsworth
1
它们不必由“int”支持 - 例如public enum Foo:byte { Bar } - Ade Stringer
@AdamHouldsworth 好观点。我已经更改为默认设置。 - onit
3
更重要的是,它们根本不是 int 类型;它们只能隐式转换成 int。你不能将一个 int 直接赋值给一个枚举类型而不进行强制类型转换,使用枚举类型来实例化模板会得到与使用 int 不同的实例,typeid(v).name() 也会返回不同的字符串等等。 - James Kanze
1
@JamesKanze 将int赋值给枚举类型是不好的设计,因为通常您不希望记住枚举代表的int代码。一般来说,如果您混合使用枚举和int,则可能不希望将其作为枚举。从技术上讲,您是正确的。但我很少看到枚举以您描述的方式使用。 - onit
@onit 我同意,至少在大多数情况下是这样的。(枚举类型也经常用于位掩码。)这就是为什么我(有点)不同意你的说法“它们默认是int”。它们不是int;每个枚举定义了一个单独的类型(至少在C++中是这样的)。 - James Kanze

6

枚举类型具有语义价值,有助于使您的代码更易阅读。它们比仅使用常量值本身要更实用,因为您可以将它们组合在一起。

将枚举视为对一组相关常量值进行命名空间分组的方法。


5
使用枚举的主要好处在于提高代码可读性。将一组逻辑值分组成人类通常比散布在源文件中的数字或const声明更易于理解的内容。
当处理诸如位标志和相关二进制操作时,它们提供了很多价值。

2
在C#中,不需要将其转换为int。您可以使用以下方式:
switch (myEnumValue)
{
    case MyEnum.ValueOne:

        // Do stuff
        break;

    case MyEnum.ValueTwo:

        // Do stuff
        break;

    default:

        // Do stuff
        break;
}

他可能在想,如果myEnumValue是一个整数...那么我相信你必须在C#中强制转换其中的一个。 - mpen

2
在C++和C#中,打开枚举是完全合法的。

1
在C++中,不需要将其转换为int类型,因此您可以编译并正常运行以下内容:
enum e{
   V1 = 0,
   V2,
   V3
};

int main()
{
   e x = V1;
   switch (x)
   {
   case V1:
      break;
   case V2:
      break;
   case V3:
      break;
   }
   return 0;
}

1

枚举主要用于提高可读性和易于理解性。当使用Facade设计模式时,它们非常有用。


0
枚举类型的整个意义在于它们不是整数(尽管在C++中它们可以隐式转换为整数;我不知道C#如何)。这为您提供了额外的类型安全性。例如,在C++中,假设您有以下代码:
enum open_type { open_read, open_write, open_readwrite, open_create };
enum exclusivity { exclusive, shared };
void open_file(char const* filename, opentype ot, exclusivity ex);

那么以下内容将会给你一个编译错误:

open_file("foo.txt", exclusive, open_write);

如果 open_file 只接受整数而不是枚举类型,那么这个错误就不会被捕获到。

0
除了可读性外,您还可以获得增强的类型安全性(至少在C#中)。
在C#中,如果一个函数接受一个枚举类型,您将无法传递超出枚举范围的值。

在C#中,枚举创建了一个独特的类型。就像布尔值一样,如果有一个函数需要一个布尔值,并尝试传递一个值为3的参数,编译器将不允许这样做。你可以试试看。 - Steve Wellens

0

除了上述的类型安全和可读性优势外,还有其他几个好处。

在一些开发IDE(如Visual Studio等)中,使用枚举时可以获得智能感知。例如,如果您将枚举用作case语句的switch值,则在声明每个case时会获得智能感知。

从可维护性的角度来看,您可以获得一个单一的位置来更改与枚举成员对应的整数值。


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