C#.Net筑基-类型系统②常见类型--枚举Enum

简介: 枚举(enum)是C#中的一种值类型,用于创建一组命名的整数常量。它们基于整数类型(如int、byte等),默认为int。枚举成员可指定值,未指定则从0开始自动递增。默认值为0。枚举可以与整数类型互相转换,并可通过`[Flags]`特性表示位域,支持位操作,用于多选场景。`System.Enum`类提供了如`HasFlag`、`GetName`等方法进行枚举操作。

枚举类型 是由基础值类型(byte、int、long等)组成的一组命名常量的值类型,用enum来申明定义。常用于一些有固定值的类别申明,如性别、方向、数据类型等。

  • 枚举成员默认是int,可以修改为其他整数类型,如byteshortuintlong等。
  • 枚举项可设置值,也可省略,或者部分设置值。值默认是从0开始,并按顺序依次递增。
  • 枚举变量的默认值始终是0
  • 枚举本质上就是命名常量,因此可以与值类型进行相互转换(强制转换)。
  • 特性Description常用来定义枚项在UI上的显示内容,使用反射获取。
public enum UserType : int  //常量类型,可以修改为其他整数类型
{
    [Description("普通会员")]
  Default,
  VIP = 10,
  SupperVIP,  //继续前一个,值为11
}
void Main()
{
  var t1 = UserType.Default;
  Console.WriteLine(t1.ToString()); //输出名称:Default
  Console.WriteLine((int)t1);       //输出值:0
    Console.WriteLine($"{t1:F}");     //输出名称:Default
  Console.WriteLine($"{t1:D}");     //输出值:0
  var t2 = (UserType)0;
  int t3 = (int)UserType.Default;
  Console.WriteLine(t1 == t2); //True
}

2.1、Enum 类API

System.Enum 类型是所有枚举类型的抽象基类,提供了一些API方法用于枚举的操作,基本都是静态方法。Enum 类型还可以作为泛型约束使用。

🔸静态成员 说明
HasFlag(Enum) 判断(位域)枚举是否包含一个枚举值,返回bool
🔸静态成员 说明
GetName<TEnum>(TEnum) 获取枚举值的(常数)名称
GetNames<TEnum>() 获取枚举定义的所有(常数)名称数组
GetValues<TEnum>() 获取枚举定义的所有成员数组
IsDefined(Type, Object) 判断给定的值(数值或名称)是否在枚举中定义
Parse<TEnum>(String) 解析数值、名称为枚举,转换失败抛出异常
TryParse<TEnum>(String, TEnum) 安全的转换,同上,转换结果通过out参数输出,返回bool表示是否转换成功
🔸其他 说明
Type.IsEnum Type的属性,用于判断一个类型是否枚举类型

2.2、位域Flags

枚举位域用[Flags]特性标记,从而可以使用枚举的位操作,实现多个枚举值合并的的能力。在有些多选值的场景很有用,用一个数值可表示多个内容,如QQ的各种钻(绿钻、红钻、黄钻...)用一个值就可以表示,参考下面代码示例。

  • 枚举定义时加上特性[Flags]
  • 要求枚举值必须是2的n次方,主要是各个成员的二进制值的对应位都不能一样,才能保障按位与、按位或运算的正确。
  • 合并值用按位或|,判断是否包含可以用按位与&,或者方法HasFlag(e)
  • 枚举类型命名一般建议用复数名词。
void Main()
{
  var t1 = QQDiamond.Green|QQDiamond.Red; //按位或运算,合并多个成员值
  Console.WriteLine((int)t1); //3,同时为绿钻、红钻
  //判断是否绿钻
  Console.WriteLine(t1.HasFlag(QQDiamond.Green)); //True
  //判断是否红钻,效果同上
  Console.WriteLine((t1 & QQDiamond.Red) == QQDiamond.Red); //True
}
[Flags]
public enum QQDiamond : sbyte
{
  None=0b0000,  //或者0
  [Description("绿钻")]
  Green=0b0001, //或者1
  Red=0b0010,   //或者2、1<<1
  Blue=0b0100,  //或者4、1<<2
  Yellow=0b1000,//或者8、1<<3
}

2.3、枚举值转换

枚举值为整形,枚举名称为string,因此常与int、string进行转换。

🔸转换为枚举 说明
Enum.Parse()/TryParse() 转换枚举值(字符串形式)、枚举名称为枚举对象,支持位域Flgas
TEnum(int) 强制转换整形值为枚举,如果没有不会报错,支持位域Flgas
/Parse/TryParse方法解析
var t1 = Enum.Parse<QQDiamond>("3");     //Green
var t2 = Enum.Parse<QQDiamond>("Green"); //Green
//强转
QQDiamond t3 =(QQDiamond)56;
🔸枚举转换为string、int 说明
ToString() 获取枚举名称,支持位域Flgas
Enum.GetName(e) 获取枚举名称,不支持位域Flgas
字符格式:G(或F) 获取枚举名称,其中F主要用于Flgas枚举
强制类型转换:(int)TEnum 获取枚举值
字符格式:D(或X) 格式化中获取枚举值,D为十进制整形,X为16进制
//string
var s1 = qd.ToString();    //Green
var s2 = Enum.GetName(qd); //Green  不支持位于Flgas
var s3 = $"{qd:G}";        //Green
//int
var n1 = (int)qd;   //1
var n2 = $"{qd:D}"; //1
相关文章
|
2月前
|
前端开发 JavaScript 关系型数据库
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
100 0
|
5月前
|
SQL 数据库 数据安全/隐私保护
C#wpf学习卡后台管理系统
C#wpf学习卡后台管理系统
129 32
|
4月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
129 3
|
5月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
191 0
|
9月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
260 18
|
9月前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
122 12
|
9月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
273 12
|
9月前
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
131 8
|
9月前
|
开发框架 JavaScript 前端开发
精选2款.NET开源的博客系统
精选2款.NET开源的博客系统
126 8
|
9月前
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
127 7