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

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们