C#中枚举Enum特性Flags和Enum.HasFlag(Enum)用法

2023-12-22 04:52

本文主要是介绍C#中枚举Enum特性Flags和Enum.HasFlag(Enum)用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

学习前需要了解位运算相关知识点。位运算介绍

Flags

标记可将枚举视为位域。

以下示例演示了FlagsAttribute特性的使用,并演示了对声明使用 [Flags] 后对 ToString 方法的影响。

   // Define an Enum without FlagsAttribute.enum SingleHue : short{None = 0,Black = 1,Red = 2,Green = 4,Blue = 8};// Define an Enum with FlagsAttribute.[Flags]enum MultiHue : short{None = 0,Black = 1,Red = 2,Green = 4,Blue = 8};static void Main( ){// Display all possible combinations of values.Console.WriteLine("All possible combinations of values without FlagsAttribute:");for(int val = 0; val <= 16; val++ )Console.WriteLine( "{0,3} - {1:G}", val, (SingleHue)val);// Display all combinations of values, and invalid values.Console.WriteLine("\nAll possible combinations of values with FlagsAttribute:");for( int val = 0; val <= 16; val++ )Console.WriteLine( "{0,3} - {1:G}", val, (MultiHue)val);}
// The example displays the following output:
//       All possible combinations of values without FlagsAttribute:
//         0 - None
//         1 - Black
//         2 - Red
//         3 - 3
//         4 - Green
//         5 - 5
//         6 - 6
//         7 - 7
//         8 - Blue
//         9 - 9
//        10 - 10
//        11 - 11
//        12 - 12
//        13 - 13
//        14 - 14
//        15 - 15
//        16 - 16
//
//       All possible combinations of values with FlagsAttribute:
//         0 - None
//         1 - Black
//         2 - Red
//         3 - Black, Red
//         4 - Green
//         5 - Black, Green
//         6 - Red, Green
//         7 - Black, Red, Green
//         8 - Blue
//         9 - Black, Blue
//        10 - Red, Blue
//        11 - Black, Red, Blue
//        12 - Green, Blue
//        13 - Black, Green, Blue
//        14 - Red, Green, Blue
//        15 - Black, Red, Green, Blue
//        16 - 16

我们可以发现3在转SingleHue后还是3,但是在转MultiHue后变为了Black|Red,也就是说使用了位运算。

加了 [Flags] 特性后有三种写法,一种是使用<<符号,第二种是0x01, 还有一种是直接写0,1,2,4,8…,一般来说是2的n次方来表示。

	///<summary>/// 权限枚举///</summary>[Flags]public enum permission                     {                                  Unknown = 0; // 也可以写成0x00或0                            Create = 1<<0, // 0x01或1                   Read = 1<<1,  //0x02或2Update = 1<<2, //0x04或4Delete = 1<<3  //0x08或8}

对于位运算的应用

//1、给用户创建、读取,修改和删除的权限
var permission= permission.Create | permission.Read | permission.Update | permission.Delete;//2、去掉用户的修改和删除权限
permission= permission&~permission.Update;
permission= permission&~permission.Delete;//3、给用户加上修改的权限
permission = permission | permission.Update;//4、判断用户是否有创建的权限
var isCreate = (permission& permission.Create)!=0;
//或者
var isCreate = (permission & permission.Create)==permission.Create;

这时permission枚举的值将变成0+1+4=5,它的ToSting()将变成“permission.Create,permission.Read,permission.Update” 这里我们可以解释为什么第五个值Delete是8而不能成为5。也就是说它的值不应该是前几项值的复合值。一个比较简单的方法就是用2的n次方来依次位每一项赋值,例如:1,2,4,8,16,32,64…。

Enum.HasFlag(Enum)

确定当前实例中是否设置了一个或多个位域。
示例

[Flags] 
public enum DinnerItems {None = 0,Entree = 1,Appetizer = 2,Side = 4,Dessert = 8,Beverage = 16,BarBeverage = 32
}public class Example
{public static void Main(){DinnerItems myOrder = DinnerItems.Appetizer | DinnerItems.Entree |DinnerItems.Beverage | DinnerItems.Dessert;DinnerItems flagValue = DinnerItems.Entree | DinnerItems.Beverage;Console.WriteLine("{0} includes {1}: {2}",myOrder, flagValue, myOrder.HasFlag(flagValue));}
}
// The example displays the following output:
//    Entree, Appetizer, Dessert, Beverage includes Entree, Beverage: True

直白来说就是判断该值是否包含传入的枚举。

注意事项

需要注意如果传入HasFlag方法中的值为0那么会始终返回true,这种情况需要 Equals 方法或 CompareTo 来判断。
如果枚举值是从非0开始就不用考虑这个问题,如1、2、4、8…

这篇关于C#中枚举Enum特性Flags和Enum.HasFlag(Enum)用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522668

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has