使用枚举直接使用整数类型的好处?

时间:2010-09-14 18:44:26

标签: c# enums

1)我知道以下好处:

  • 它们会提高抽象级别,因为您可以立即看到底层积分值代表什么。

  • 您可以使用它们代替幻数,并通过这样做使代码更容易理解

  • 它们还限制enum变量可以具有的值,这样做可以使应用程序更安全,因为程序员知道哪些值对变量有效,所以我猜它们提供类型安全< / p>

他们提供的直接使用整数值是否还有其他好处?

2)为什么他们使用积分作为基础类型而不是字符串?

谢谢

5 个答案:

答案 0 :(得分:8)

您列出了很多核心原因,其中枚举优于整数类型。

  • 命名常量比魔术数字更安全,更易读

  • Enums向程序员描述了它们的用途。积分值不会。

  • 自然地限制了可以传入的值集。(你已经获得了类型安全冰山的一角......但看起来更深......)

您还可以添加:

  • 极大地增加了类型安全性。如果你接受'int',那么任何int都可以传入。如果你接受一个VehicleType,那么只能传入一个VehicleType。我不只是在谈论有人在最大允许数为5时传入6。我的意思是,如果你将FuelType.Unleaded传递给一个认为它意味着VehicleType.Aeroplane的函数?有了枚举,编译器会告诉你,你是个白痴。一个整体类型说“是的,5对我很好”,你的程序表现出非常奇怪的行为,可能很难追查。

  • 更容易重构。就像任何魔术常数一样,如果你在程序中传递了一百个位置的值5,那么如果你决定改变5以获得不同的含义,你就会遇到麻烦。使用枚举(只要您没有二进制向后兼容性问题),您可以更改基础值。如果您愿意,也可以更改枚举的基础类型(byte - &gt; int - &gt; long),而不必执行任何操作,而不是重新编译客户端代码。

  • 当可以命名位和掩码时,位域更容易使用。如果添加新位,您通常可以安排一些事情,这样只需更新相关掩码就可以让大部分现有代码完美地处理新的位域,而无需从头开始重写。

  • 整个计划的一致性。如果您对模糊处理和类型安全性非常小心,则枚举允许您使用代码中的相同名称来表示用户选择的命名值列表,但不会降低使用字符串的效率。< / p>

  • 每个人都理解为什么常量在代码中很棒。枚举只是为您提供了一种将相关组常量保持在一起的方法。你可以使用consts的命名空间以更混乱的方式实现同​​样的目的。

  • 使用enum作为参数而不是bool不仅使代码自我记录,可读,而且不容易出错。当您意识到两个选项不够时,它还可以更容易地添加第三个选项。

与所有工具一样,枚举可能会被滥用。只要在有意义的地方使用它们。

2)为什么使用字节或整数而不是字符串?只是它们小而有效。

答案 1 :(得分:5)

我猜想它们需要底层整数类型以确保比较的简单性并且更容易支持位标志。没有这个限制,我们,或编译器,或运行时,可能不得不采取一些模糊来做组合之类的事情 - 或者我们会陷入这样的情况 - 如你所说 - 我们不应该关心底层类型(抽象点)然后当我们试图说A | B时,我们得到一个运行时错误,因为我们使用了一个不能进行那种操作的底层类型。

答案 2 :(得分:2)

当您想要使用枚举作为标志时,一个好处是。

所以如果你定义一个这样的枚举:

[Flags]
public enum TestEnum{ A, B, C, D };

然后,如果您有一个接受TestEnum实例作为变量的方法,您可以组合枚举中的值,这样您就可以发送例如A | B | C作为方法的参数。然后,在方法内部,您可以检查如下参数:

if ((paramname & TestEnum.A) > 0) 
{
  //do things related to A
}
if ((paramname & TestEnum.B) > 0) 
{
  //do things related to B
}
//same for C and D

另外,我认为你提到的原因本身就足以使用枚举。

另外,关于您可以使用类似(TestEnum)500;的代码强制将错误的值强制转换为枚举的注释,如果您不想破坏代码,则很难做到。

枚举的值0应该是默认值,或者在标志“缺少所有其他标志”的情况下非常重要,因为行TestEnum myenum会将myenum设置为0,无论如何如果你已经为0定义了任何枚举值。

答案 3 :(得分:1)

您还可以从字符串表示中解析Enum。您可以从数据源或用户条目中获取该字符串。

我认为你以“神奇的数字”把我卖给了Enums。

答案 4 :(得分:1)

枚举的主要好处是可以以一致,富有表现力和类型安全的方式引用常量。 可读性当然是使用枚举的最大优势。

另一个优点是枚举常量由编译器自动生成 例如,如果您的程序中可能出现错误代码的枚举常量类型,那么您的枚举定义可能如下所示: 枚举Error_Code { 内存不足, 文件未找到 }; 编译器自动为OUT_OF_MEMORY分配值0(零) 因为它首先出现在definition.FILE_NOT_FOUND中,等于1,依此类推。 如果您通过使用符号常量或幻数来接近相同的示例,则需要编写更多代码来执行相同操作。