关于enum应用的总结

1、关于enum的定义
///<summary>
///新闻、下载资源等的审核状态
///</summary>
publicenumApplyStatus
{
///<summary>
///审核不通过
///</summary>
NotPassed=-1,
///<summary>
///未审核
///</summary>
NotApply=0,
///<summary>
///审核通过
///</summary>
Passed=1
}
2、符号名和常数值的互相转换
ApplyStatusstatus=ApplyStatus.NotApply;
intfabNum=(int)status;//转换为常数值。必须使用强制转换。
ApplyStatusstatusString=(ApplyStatus)1;//常数值转换成符号名。如果使用ToString(),则是((ApplyStatus)1).ToString(),注意必须有括号。
stringapplyType=status.ToString();//显示符号名
stringapplyVal=status.ToString("D");//显示常数值
3、获得所有符号名的方法(具体参见Enum类)
foreach(stringsinEnum.GetNames(typeof(ApplyStatus)))
{
Console.WriteLine(s);
}
4、将枚举作为位标志来处理
根据下面的两个例子,粗略地说,一方面,设置标志[Flags<wbr></wbr>]或者[FlagsAttribute],则表明要将符号名列举出<wbr></wbr>来;另一方面,可以通过强制转换,将数字转换为符号名。说不准确。看下面的例子体会吧。注意:
例一:
Fabric fab = Fabric.Cotton | Fabric.Rayon | Fabric.Silk;
Console.WriteLine("MyFabric = {0}", fab);//输出:Fabric.Cotton | Fabric.Rayon | Fabric.Silk;
例二:
class FlagsAttributeDemo
{
// Define an Enum without FlagsAttribute.
enum SingleHue : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};

// Define an Enum with FlagsAttribute.
[FlagsAttribute]
enum MultiHue : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};

static void Main( )
{
Console.WriteLine(
"This example of the FlagsAttribute attribute /n" +
"generates the following output." );
Console.WriteLine(
"/nAll possible combinations of values of an /n" +
"Enum without FlagsAttribute:/n" );

// Display all possible combinations of values.
for( int val = 0; val <= 8; val++ )
Console.WriteLine( "{0,3} - {1}", val, ( (SingleHue)val ).ToString( ) );

Console.WriteLine( "/nAll possible combinations of values of an /n" + "Enum with FlagsAttribute:/n" );

// Display all possible combinations of values.
// Also display an invalid value.
for( int val = 0; val <= 8; val++ )
Console.WriteLine ( "{0,3} - {1}", val, ( (MultiHue)val ).ToString( ) );
}
}

/*
This example of the FlagsAttribute attribute
generates the following output.

All possible combinations of values of an
Enum without FlagsAttribute:

0 - Black
1 - Red
2 - Green
3 - 3
4 - Blue
5 - 5
6 - 6
7 - 7
8 - 8

All possible combinations of values of an
Enum with FlagsAttribute:

0 - Black
1 - Red
2 - Green
3 - Red, Green
4 - Blue
5 - Red, Blue
6 - Green, Blue
7 - Red, Green, Blue
8 - 8
*/
5、枚举作为函数参数。经常和switch结合起来使用。下面举例

public static double GetPrice(Fabric fab)
{
switch (fab)
{
case Fabric.Cotton: return (3.55);
case Fabric.Silk: return (5.65);
case Fabric.Wool: return (4.05);
case Fabric.Rayon: return (3.20);
case Fabric.Other: return (2.50);
default: return (0.0);
}
}

6、上面三点一个完整的例子

//1、enum的定义
public enum Fabric : short
{
Cotton = 1,
Silk = 2,
Wool = 3,
Rayon = 8,
Other = 128
}

//将枚举作为参数传递
public static double GetPrice(Fabric fab)
{
switch (fab)
{
case Fabric.Cotton: return (3.55);
case Fabric.Silk : return (5.65);
case Fabric.Wool: return (4.05);
case Fabric.Rayon: return (3.20);
case Fabric.Other: return (2.50);
default: return (0.0);
}
}

public static void Main()
{
Fabric fab = Fabric.Cotton;
int fabNum = (int)fab;
string fabType = fab.ToString();
string fabVal = fab.ToString ("D");
double cost = GetPrice(fab);
Console.WriteLine("fabNum = {0}/nfabType = {1}/nfabVal = {2}/n", fabNum, fabType, fabVal);
Console.WriteLine("cost = {0}", cost);
}

7、Enum类的使用

Enum.IsDefinde、Enum.Parse两种方法经常一起使用,来确定一个值或符号是否是一个枚举的成员,然后创建一个实例。Enum.GetName打印出一个成员的值;Enum<wbr></wbr>.GetNames打印出所有成员的值。其中注意typeof的使用。这一点很重要。

public enum MyFamily
{
YANGZHIPING = 1,
GUANGUIQIN = 2,
YANGHAORAN = 4,
LIWEI = 8,
GUANGUIZHI = 16,
LISIWEN = 32,
LISIHUA = 64,
}

string s = "YANGHAORAN";
if (Enum.IsDefined(typeof(MyFamily), s))
{
MyFamily f = (MyFamily)Enum.Parse(typeof(MyFamily), s);
GetMyFamily(f);
Console.WriteLine("The name is:" + Enum. GetName(typeof(MyFamily), 2));
string[] sa = Enum.GetNames(typeof(MyFamily));
foreach (string ss in sa)
{
Console.WriteLine(ss);
}
}

<think> 首先,用户查询的是“enum(枚举)和switch语句结合使用的应用例程”,所以我需要从提供的引用中提炼相关信息来构建一个清晰的回答。 从用户提供的引用中提取关键信息: - 引用[1] 直接给出了一个C语言中使用enum与switch结合的代码实例:定义了一个Color枚举,并使用switch语句根据枚举值打印颜色。 - 引用[2] 讨论的是枚举与宏定义在嵌入式系统中的区别,特别是在资源受限的51单片机中枚举会占用存储空间的问题。 - 引用[3] 展示了一个W801单片机SDK中使用枚举设置处理器工作速度的例子,其中枚举用于定义时钟频率。 - 引用[4] 涉及USART通信的寄存器配置和函数,但没有直接提到枚举与switch结合。 用户需求明确是“enum和switch结合使用的应用例程”,所以我应该优先引用[1]中的代码作为核心示例,因为它最直接匹配查询。 回答结构: - 根据系统级指令,使用中文回答。 - 结构清晰,逐步解决问题。 - 行内数学表达式用$...$格式,但这里主要是代码示例,不太需要数学表达式。 - 独立公式用$$...$$格式,但本问题不涉及复杂公式。 - 引用末尾添加引用标识,如[^1]。 - 生成相关问题。 步骤: 1. **引言**:简要解释enum和switch结合使用的益处,如提高代码可读性和可维护性。 2. **核心示例**:直接展示引用[1]中的代码,并简要说明。 3. **其他引用相关**:提及引用[2]中关于资源使用的考量,以及引用[3]中枚举在嵌入式中的应用示例。 4. **完整回答**:确保逻辑流畅。 5. **生成相关问题**:在回答末尾添加相关问题。 构建回答: - **开头**:解释enum的作用:枚举用于定义一组命名的常量,使其更具可读性。 - **示例**:引用引用[1]的代码,展示enum与switch结合。 - **嵌入式背景**:考虑到引用[2]和[3]来自嵌入式背景,添加上下文:在嵌入式系统中常用于状态机或配置设置。 - **引用[3]示例**:虽然引用[3]不是switch示例,但可以简要提到枚举定义时钟频率,可能用于switch。 - **注意事项**:提到引用[2]中的存储空间问题,提醒在资源受限系统中权衡。 - **结束**:总结益处。 - **相关问题**:生成几个相关问题。 最终回答大纲: 1. 解释enum和switch结合的好处。 2. 展示一个标准应用例程(来自引用[1])。 3. 嵌入式中应用示例(如引用[3]),如果有相关switch代码更好;但引用[3]中没有switch,所以聚焦在引用[1]。 4. 提醒资源考量(来自引用[2])。 5. 生成相关问题。 针对引用[3],虽然它显示了枚举用于函数参数,但没有switch语句;我可以推断它在switch上下文中可能的使用,比如在配置函数中处理不同枚举值。 完整代码示例:从引用[1]复制并格式化。 </think> ### enum 和 switch 语句结合使用的应用例程 在 C 语言中,枚举(enum)常用于定义一组命名的整型常量,结合 switch 语句可以显著提高代码的可读性和可维护性。枚举将数字映射为有意义的名字,而 switch 语句基于枚举值执行不同分支的逻辑。这在状态机、配置设置或错误处理等场景中非常实用。以下是一个详细的应用例程和解释,基于您提供的引用内容。 #### 核心应用例程(来自引用[1]) 以下代码展示了枚举与 switch 语句的典型结合使用: ```c #include <stdio.h> // 定义枚举类型 enum Color enum Color { RED, // 默认对应整数值 0 GREEN, // 默认对应整数值 1 BLUE // 默认对应整数值 2 }; // 函数使用 switch 根据枚举值打印颜色 void printColor(enum Color c) { switch (c) { case RED: printf("Red\n"); break; case GREEN: printf("Green\n"); break; case BLUE: printf("Blue\n"); break; default: printf("Unknown color\n"); // 处理非法枚举值 } } int main() { printColor(GREEN); // 输出: Green return 0; } ``` **说明**: - **枚举定义**:`enum Color` 定义了三个常量(RED=0, GREEN=1, BLUE=2),替代了直接使用数字(如 `case 1:`),使代码更易读[^1]。 - **Switch 逻辑**:`switch(c)` 基于枚举值分支执行: - 当 `c = GREEN`(即整数值 1)时,匹配 `case GREEN:`,输出 "Green"。 - `break` 确保只执行匹配的分支。 - `default` 处理未定义的枚举值(如传入整数 3),增强鲁棒性。 - **优点**:枚举名称(如 GREEN)比魔术数字(如 1)更直观,减少错误;switch 集中管理逻辑,便于扩展。 #### 嵌入式系统中的应用(综合引用[2][3]) 在嵌入式开发中,枚举常用于硬件配置或状态管理。以下示例基于引用[3],展示在单片机中结合 switch 的状态机实现: ```c #include <reg51.H> sbit K = P3^7; // 定义按键引脚 // 定义状态枚举 enum State { STATE_OFF, // 状态 0: 关闭 STATE_LOW, // 状态 1: 低亮度 STATE_MEDIUM, // 状态 2: 中亮度 STATE_HIGH // 状态 3: 高亮度 }; void main(void) { enum State currentState = STATE_OFF; // 初始化状态 while(1) { switch(currentState) { case STATE_OFF: P2 = 0xFF; // LED全灭 break; case STATE_LOW: P2 = ~0x01; // LED低亮(二进制取反) break; case STATE_MEDIUM: P2 = ~0x02; // LED中亮 break; case STATE_HIGH: P2 = ~0x04; // LED高亮 break; default: P2 = 0xFF; // 异常处理 break; } // 按键触发状态切换 if (K == 0) { currentState = (currentState + 1) % 4; // 循环切换状态 while(K == 0); // 等待按键释放 } } } ``` **说明**: - **枚举优化可读性**:`enum State` 定义了设备状态(如 `STATE_LOW`),避免直接使用数字(如 `case 1:`),使逻辑更清晰[^2]。 - **Switch 状态机**:switch 基于枚举值控制 LED 亮度,实现简洁的状态转换。 - **资源考量**:在资源受限系统(如 51 单片机)中,枚举占用存储空间(每个枚举值通常占 2 字节),而宏定义(`#define`)在预处理阶段文本替换,不额外占用 ROM。建议在存储空间充足时优先用枚举提升可维护性;空间紧张时权衡使用宏[^2]。 #### 其他应用场景 - **硬件配置**:如引用[3]中的时钟设置枚举 `enum CPU_CLK`,可与 switch 结合在初始化函数中动态配置处理器速度[^3]。 - **通信协议**:在 USART 通信中(引用[4]),枚举可用于定义错误码或命令字,switch 处理不同响应[^4]。 #### 最佳实践总结 - **可读性**:枚举命名应直观(如 `RED` 而非 `COLOR_0`)。 - **错误处理**:switch 中始终包含 `default` 分支。 - **资源优化**:在嵌入式系统中,评估枚举的存储开销;必要时混合使用宏定义。 相关问题: 1. 在资源受限的单片机中,如何减少枚举类型的内存占用? 2. 枚举与宏定义(#define)在可读性和性能上有哪些具体区别? 3. 如何在状态机设计中结合枚举和 switch 提高代码可维护性? 4. 枚举在 C 语言中的底层实现是什么?是否会影响执行效率?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值