65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 枚举类型详解

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (5投票s)

2010年7月2日

CPOL

2分钟阅读

viewsIcon

39412

.NET 枚举类型的概述

引言

本文旨在介绍 .NET 枚举类型。

背景

代码可读性是衡量源代码质量的重要因素。代码越容易理解,就越容易维护。你是否曾经使用数字来表示一系列变量值?例如

Dim CalculationOperation As Integer = 0
CalculationOperation = _ GetOperation ()
Select Case CalculationOperation
    Case 1 ’ Addition
        _PerformAddition()
    Case 2 ‘ Subtraction
        _PerformSubtraction()
    Case 3 ‘ Multiplication
        _PerformMultiplication()
End Select

这要求你以及可能接触你代码的任何其他开发人员记住所有表示颜色的可能的数值。这可能成为维护噩梦!为了解决这个问题,VB.NET 提供了枚举类型。

使用枚举类型的理由

可读性

来自维基百科

“在计算机编程中,枚举类型(也称为枚举或 enum)是一种数据类型,由一组名为元素、成员或枚举器的值组成。枚举器名称通常是语言中的常量标识符。”

枚举类型允许你为一系列整数值赋予英文描述。也许一个例子可以解释这一点。

Public Type CalculatorOperations
    Addition       = 1
    Subtraction    = 2
    Multiplication = 3
End Type

Dim Operation As CalculatorOperations
Operation = _ GetOperation ()
Select Case Operation
    Case CalculatorOperations.Addition
        _PerformAddition()
    Case CalculatorOperations.Subtraction
       _PerformSubtraction()
    Case CalculatorOperations.Multiplication
       _PerformMultiplication()
End Select

这个例程更容易阅读。

在编写例程时,请务必考虑表示除数字本身以外的值的数字字面量,作为创建枚举类型的可能原因。

枚举作为例程参数

枚举类型非常适合作为例程参数。考虑以下示例。

糟糕的示例

Dim ApplicationState as Integer = 5 ‘lets say five stands for Fatal Crash!
Sub _SetApplicationState(ByVal State As Integer)

好的示例

Dim ApplicationState As AppState = AppState.FatalCrash
Sub _SetApplicationState(ByVal State As AppState)

如果你正在使用 Visual Studio,那么你无疑已经注意到将枚举类型作为函数参数的好处。在编写调用例程的代码时,IntelliSense 会向你显示枚举类型的所有可用成员。

编译器类型检查

使用枚举类型还可以提供编译器的类型检查。考虑以下代码块

‘Valid color values are 0 – 9
Dim CurrentColor As Integer
CurrentColor = 12 ‘invalid color

这在使用枚举类型时是不可能的。枚举类型可以提供强大的返回值。考虑以下代码

Dim LoginResult As Boolean = false
LoginResult = _AttemptLogin()
If LoginResult = True Then
    _Authenticateuser()
End If
If LoginResult = False Then
     _InitiateLogin()
End If

如你所见,truefalse 允许两种条件

Dim LoginResult As AuthResult 
LoginResult = _AttemptLogin()
If LoginResult = AuthResult.Authenticated Then
    _Authenticateuser()
End If

If LoginResult = AuthResult.Failed Then
    _InitiateLogin()
End If

If LoginResult = AuthResult.Suspended Then
    _AlertSuspended()
End If

If LoginResult = AuthResult.AuthenticatedChangePassword Then
    _InitiatePasswordChange()
    _AuthenticateUser()
End If

你是否看到了可能性?

将第一个和最后一个条目定义为循环限制

你可能会遇到需要迭代枚举类型中每个成员的情况。一种建议的做法是保留第一个和最后一个元素作为循环限制。

Public Type RGBValue
 RGB_FirstValue = 0
 RGB_Red = 0
 RGB_Green = 1
 RGB_Blue = 2
 RGB_LastValue = 2
End Type

Dim RGBVal As RGBValue
For RGBVal = RGBValue.RGB_FirstValue To RGBValue.RGB_LastValue
 ‘process here
Next

结论

好吧,我希望我已经说明了使用枚举类型的一些好处。欢迎提出所有反馈。

谢谢,
Bryan James
MCP, MCAD, MCSD.NET
http://www.bytepushers.com
http://www.twitter.com/budbjames

历史

版本 1 2010/3/7

© . All rights reserved.