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
相关文章
|
10天前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
21 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
3天前
|
前端开发 测试技术 C#
如何开发一套基于C#和.NET 6.0手术麻醉系统? 手术麻醉系统源码
如何开发一套基于C#和.NET 6.0手术麻醉系统?
12 1
|
4天前
|
开发框架 前端开发 调度
C#基于Quartz.NET实现任务调度并部署Windows服务
C#基于Quartz.NET实现任务调度并部署Windows服务
|
9天前
|
Java C# 数据安全/隐私保护
|
16天前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
29 10
|
14天前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
|
22天前
|
XML 开发框架 .NET
【.NET Core】常见C#代码约定
【.NET Core】常见C#代码约定
19 5
|
21天前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
21天前
|
XML 开发框架 人工智能
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
|
21天前
|
SQL 设计模式 开发框架
.NET异步有多少种实现方式?(异步编程提高系统性能、改善用户体验)
想要知道.NET异步有多少种实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解.NET异步实现的四种方式。