常量与枚举
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgEnumerations
- 最后更新: 2021-01-23
枚举,一种由若干命名常量组成的特殊用户自定义类型。
语法
Enum [typename [ Explicit ] ]
symbolname [= expression] [, ...]
...
End Enum参数
typename
Enum 的名称
symbolname
常量的名称
expression
常量表达式
Explicit
要求符号必须通过 typename.symbolname 显式引用
说明
枚举是由一组命名整数常量组成的用户自定义类型。
枚举用于定义序列和状态,特别是当这些状态之间存在自然递进关系时。
枚举提供上下文来描述一系列值,这些值通过符号表示为命名常量。
与命名空间不同,枚举也可以在任何作用域块中定义,其符号仅在声明枚举的作用域内可见。
枚举有助于编写更易维护的代码,因为它们是符号化的,允许你在使用显式名称的同时处理整数值。
枚举是值类型,这意味着它们包含自己的值,不能继承或被继承。
Enum 不能包含任何成员过程或成员数据(只有符号),但可以通过包含(命名或匿名)嵌入到 Type 中。
用法
枚举中的每个符号都隐式分配一个整数值(正数或负数),对应于其在枚举中值的顺序位置。
每个符号都被视为常量。
默认情况下,第一个值分配为 0,下一个分配为 1,依此类推。
但你可以显式设置任何符号的值(下一个符号将隐式设置为前一个值加上 1 的增量)。
给符号赋予的值不必是唯一的。
当枚举被限定为 Explicit 时,对任何 symbolname 的访问必须始终以 typename 为前缀。
前缀也可用于解决与其他实体的歧义。
Enum 实例可以像任何用户自定义类型实例一样传递给过程(包括用于定义重载运算符的定义)。
Enum 实例的大小始终等于 Integer 的大小(无论为编译器赋值定义了多少符号)。
Enum 实例(或 Enum 符号)可以隐式转换为整数。
注意:
在许多语言中,没有整数变量可以隐式转换为有作用域的枚举类型实例(反之亦然),后者是强类型的(声明等同于 FreeBASIC 中限定为
Explicit的Enum),此类转换需要显式转换。但 FreeBASIC 接受它(即使数值与任何已定义的
Enum符号不匹配)。这只是 FreeBASIC 在普通Enum功能方面众多不足之一。因此,声明真正的
ENUM实例(其大小与INTEGER相同)没有太大意义,否则可以声明任何预建整数变量来代替。如果不使用
Explicit限定符(未强制命名空间前缀),使用ENUM结构与简单的离散常量列表相比没有太大意义,除了值的自动递增。
示例
简单使用示例:
start GeSHi
Enum Colors
black
blue
green
cyan
red
pink
yellow
grey
dark_grey
bright_blue
bright_green
bright_cyan
bright_red
bright_pink
bright_yellow
white
End Enum
Sub print_fbc (ByVal foreground As Colors, ByVal background As Colors)
Color foreground, background
Print " " & __FB_SIGNATURE__ & " "
End Sub
Dim As Colors std_foreground, std_background
std_foreground = LoWord(Color())
std_background = HiWord(Color())
Dim As Colors my_foreground, my_background
my_foreground = bright_yellow
my_background = cyan
print_fbc(my_foreground, my_background)
Color std_foreground, std_background
Print "end"
Sleepend GeSHi
相同结果,但使用 Type 接口 Enum 以在为 Enum 实例赋值数值时强制显式转换(参见上面的"注意"):
start GeSHi
Enum Colors Explicit
black
blue
green
cyan
red
pink
yellow
grey
dark_grey
bright_blue
bright_green
bright_cyan
bright_red
bright_pink
bright_yellow
white
End Enum
Type Console_Colors
Public:
Declare Property foreground () As Colors
Declare Property foreground (ByVal c As Colors)
Declare Property background () As Colors
Declare Property background (ByVal c As Colors)
Private:
Dim As Colors _foreground
Dim As Colors _background
End Type
Property Console_Colors.foreground () As Colors
Return This._foreground
End Property
Property Console_Colors.foreground (ByVal c As Colors)
This._foreground = c
End Property
Property Console_Colors.background () As Colors
Return This._background
End Property
Property Console_Colors.background (ByVal c As Colors)
This._background = c
End Property
Sub print_fbc (ByVal foreground As Colors, ByVal background As Colors)
Color foreground, background
Print " " & __FB_SIGNATURE__ & " "
End Sub
Dim As Console_Colors std_colors
std_colors.foreground = Cast(Colors, LoWord(Color())) '' explicit cast mandatory because of property declaration
std_colors.background = Cast(Colors, HiWord(Color())) '' explicit cast mandatory because of property declaration
Dim As Console_Colors my_colors
my_colors.foreground = Colors.bright_yellow
my_colors.background = Colors.cyan
print_fbc(my_colors.foreground, my_colors.background)
Color std_colors.foreground, std_colors.background
Print "end"
Sleepend GeSHi
另请参阅
EnumType- 常量
返回 目录