关于enum应用的总结

关于enum应用的总结
1、关于enum的定义
   enum Fabric{Cotton = 1,Silk = 2,Wool = 4,Rayon = 8,Other = 128}
2、符号名和常数值的互相转换            Fabric fab = Fabric.Cotton;
   int fabNum = (int)fab;//转换为常数值。必须使用强制转换。           
   Fabric fabString = (Fabric)1;//常数值转换成符号名。如果使用ToString(),则是((Fabric)1).ToString(),注意必须有括号。
   string fabType = fab.ToString();//显示符号名
   string fabVal = fab.ToString ("D");//显示常数值
3、获得所有符号名的方法(具体参见Enum类)       
   public enum MyFamily
        {
            YANGZHIPING = 1,
            GUANGUIQIN = 2,
            YANGHAORAN = 4,
            LIWEI = 8,
            GUANGUIZHI = 16,
            LISIWEN = 32,
            LISIHUA = 64,
        }           
   foreach (string s in Enum.GetNames(typeof(MyFamily)))
        {
            Console.WriteLine(s);
        }
4、将枚举作为位标志来处理
   根据下面的两个例子,粗略地说,一方面,设置标志[Flags]或者[FlagsAttribute],则表明要将符号名列举出来;
   另一方面,可以通过强制转换,将数字转换为符号名。说不准确。看下面的例子体会吧。注意:
          例一: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.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、付费专栏及课程。

余额充值