C#基础(2)枚举

前言

我们其实在前面已经了解过枚举到底有什么作用,但是那毕竟是概念性的语言,理解起来很抽象,今天我们会具体来讲一讲枚举,并谈一谈它的应用。

希望你能从今天的C#基础中有所收获。

基本概念

1.枚举:是一个比较特别的存在,是被明明的整形常量集合

2.申明枚举:创建一个自定义的枚举类型

注意,这只是创建一个枚举类型,并没有实实在在创建一个枚举,这个概念在后续学习中也会反复出现。大家一定要辨别申明类型,和申明变量是两个完全不同的概念。

3.申明枚举变量:用一个定义的枚举类型去申明一个此枚举类型的变量。

4.申明枚举的语法

cs 复制代码
enum E_自定义枚举名//枚举名以E或E_开头,有些公司要求不同
{
    自定义枚举项名字1,
    自定义枚举项名字2,
    //枚举包裹的整型变量,第一个为0(默认),向下累加(只要后续值不声明,默认累加)
}

看到这个语法,你可能还是有点不清楚枚举到底怎么用,那么我们切切实实进一个例子来看。

5.枚举的使用

以下是一个使用C#编写的代码示例,用来展示如何使用枚举来模拟状态变化:

csharp 复制代码
using System;

public enum GameState
{
    Menu,
    Playing,
    Paused,
    GameOver
}

class Program
{
    static void Main(string[] args)
    {
        GameState currentState = GameState.Menu;

        while (true)
        {
            switch (currentState)
            {
                case GameState.Menu:
                    Console.WriteLine("Welcome to the game! Press any key to start.");
                    Console.ReadKey();
                    currentState = GameState.Playing;
                    break;
                case GameState.Playing:
                    Console.WriteLine("Playing the game.");
                    // 游戏逻辑代码
                    Console.WriteLine("Press P to pause or Q to quit.");
                    ConsoleKeyInfo input = Console.ReadKey();
                    if (input.Key == ConsoleKey.P)
                    {
                        currentState = GameState.Paused;
                    }
                    else if (input.Key == ConsoleKey.Q)
                    {
                        currentState = GameState.GameOver;
                    }
                    break;
                case GameState.Paused:
                    Console.WriteLine("Game paused. Press R to resume.");
                    ConsoleKeyInfo resumeInput = Console.ReadKey();
                    if (resumeInput.Key == ConsoleKey.R)
                    {
                        currentState = GameState.Playing;
                    }
                    break;
                case GameState.GameOver:
                    Console.WriteLine("Game over. Press any key to restart.");
                    Console.ReadKey();
                    currentState = GameState.Menu;
                    break;
            }
        }
    }
}

这个代码示例演示了一个简单的游戏状态变化过程。开始时,游戏状态为菜单状态。玩家按下任意键后,游戏状态变为Playing。在Playing状态下,玩家可以按下P键暂停游戏,按下Q键结束游戏。当游戏状态变为Paused时,玩家可以按下R键继续游戏。当游戏状态变为GameOver时,玩家可以按下任意键重新开始游戏。

我们的枚举在此的作用更多是为了定义游戏状态,我们可以发现,枚举的根本作用其实就是让代码看上去更易懂,如果我们把游戏状态改为数字,可能还要来回翻阅才能确定这个常量的真实含义,但是如果通过枚举的话,我们代码的阅读性就得到了大大的提升。

tips:枚举和switch天生一对

枚举声明提示

声明位置:

  1. namespace(命名空间)里
  2. class(类)语句块中
  3. struct(结构体)语句块中

tips:枚举不能再函数语句块中声明。

枚举类型转变

1.枚举和int互转

可以通过使用枚举类型的ToInt()方法和显式类型转换来实现枚举和int类型的互相转换。以下是一个简单的示例:

csharp 复制代码
using System;

public enum Color
{
    Red = 1,
    Green = 2,
    Blue = 3
}

public class Program
{
    public static void Main(string[] args)
    {
        Color color = Color.Blue;

        // 将枚举转换为int
        int colorValue = (int)color;
        Console.WriteLine(colorValue);

        // 将int转换为枚举
        int intValue = 2;
        Color enumValue = (Color)intValue;
        Console.WriteLine(enumValue);

        Console.ReadLine();
    }
}

在上面的示例中,我们首先声明了一个Color枚举,其中包含Red、Green和Blue三个选项。然后,我们将Color.Blue赋值给一个color变量。接下来,我们使用显式类型转换将枚举类型转换为int类型,并将结果打印出来。然后,我们将一个int值2赋值给一个intValue变量,并将其转换为枚举类型Color,并将结果打印出来。

运行上面的代码,输出将是:

cs 复制代码
3
Green

可以看到,枚举类型Color.Blue转换为int类型之后的值是3,而int类型2转换为枚举类型之后的值是Green。

2.枚举和string的互转

可以使用ToString的方法来实现枚举到string的转换,而string到枚举的转换大多是使用括号强转的方式,有点忘记的朋友可以回C#入门重新看一下。

枚举的作用

其实通过例子和之前的讲解,我们再一次做一个概括。

在游戏开发中,我们的对象一般都会有很多状态,不仅仅是游戏本身有暂停,游玩,退出这些,角色本身也有待机,行走,攻击等状态,那我们其实在切换状态的时候,就需要枚举来标明。

枚举本身,也可以让我们在开发中更方便阅读,提高代码的可维护性,不至于过段时间看代码,就不知道这是谁写的了。

总结

其实学到这里,想必你已经掌握了枚举的基本用法和作用,我相信你在以后的开发中也会体会到枚举的好处。

还是那句话,学习路上,戒骄戒躁,脚踏实地。

请期待我下一篇博客,感谢你的观看。

相关推荐
涛思数据(TDengine)5 分钟前
TDengine TSDB 3.4.3.3 上线:流计算分层闭环、虚拟表跨层引用,查询关联一次写完
数据库·人工智能·数据分析·时序数据库·tdengine·工业
远方16097 分钟前
118-五大进程LGWR DBWn CKPT SMON PMON 与存储故障-文件系统对照
大数据·数据库·sql·oracle·database
ss2739 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 17 PostgreSQL SQL高级查询:窗口函数、CASE、COALESCE
数据库·笔记·postgresql
远方160915 分钟前
119-Oracle CDB 下修改和重置 SYS SYSTEM密码记录
大数据·数据库·sql·oracle·database
solidwork_s16 分钟前
SOLIDWORKS 2027 Electrical电气新功能汇总
运维·服务器·人工智能·solidworks
0+11116 分钟前
Linux --ARP的具体过程与ARP欺骗
linux·服务器·网络
独孤九剑打醒他19 分钟前
海思 Hi3798MV100 C 语言 DNS 广告过滤方案
运维·服务器
橙光成长19 分钟前
Context Mode 深度解析:用沙盒、SQLite 与钩子路由,把 AI 编码 Agent 的上下文消耗削减 98%
数据库·人工智能·sqlite
数据库小学妹35 分钟前
MySQL时区问题排查:TIMESTAMP和DATETIME的区别与跨时区对账踩坑
数据库·mysql·datetime·时区·timestamp·跨时区对账
科技小E1 小时前
模型训完≠能用:深度学习推理工作站DLTM推理验证如何把住“最后一公里”质量关
服务器·深度学习·自动化