笔记:Enum中FlagsAttribute特性的用法

一、目的:分享Enum中FlagsAttribute特性的用法

        在C#中,Enum(枚举)类型可以使用[Flags]属性来表示一个枚举可以存储多个值。这是通过按位运算符(如|(或)和&(与))来实现的。使用[Flags]属性的枚举通常用于表示一组开关或状态的组合。

        在C#中使用[Flags]属性定义枚举时,遵循一些规则和最佳实践可以帮助确保你的枚举正确地表示复合值。这些规则包括:
1.    使用二进制位表示值:每个枚举值应该是2的幂(即,1, 2, 4, 8, 16等),这样可以通过按位运算(如按位与&、按位或|)组合和解析这些值。
2.    为组合值提供命名常量:如果你的枚举中有常用的值组合,可以为这些组合提供命名常量,以提高代码的可读性。
3.    包括一个表示“无”状态的值:通常,值为0的枚举成员用于表示“无”或“空”状态,这是一个好习惯。
4.    使用[Flags]属性:在枚举定义之前添加[Flags]属性,以明确表示该枚举用于位字段(即,可以存储多个值的枚举)。
5.    为枚举类型选择合适的底层类型:默认情况下,枚举的底层类型是int。如果你的枚举不需要int那么大的范围,可以选择一个更小的底层类型(如byte)来节省空间。


二、实现

如何定义

[Flags]
public enum FileAccess
{None = 0,    // 表示无权限Read = 1,    // 2^0, 单个权限Write = 2,   // 2^1, 单个权限Execute = 4, // 2^2, 单个权限ReadWrite = Read | Write, // 组合权限All = Read | Write | Execute // 所有权限
}

        FileAccess枚举使用[Flags]属性,表示可以组合多个值。ReadWrite和All是使用按位或运算符组合其他值的示例。FileAccess枚举使用[Flags]属性,表示可以组合多个值。ReadWrite和All是使用按位或运算符组合其他值的示例。

注意定义

如何使用

        FileAccess access = FileAccess.Read | FileAccess.Write;Console.WriteLine(access); // 输出: Read, WriteConsole.WriteLine(access.HasFlag(FileAccess.Read)); // 输出: TrueConsole.WriteLine(access.HasFlag(FileAccess.Execute)); // 输出: False

使用HasFlag方法检查特定的标志是否被设置

如何移除枚举标志中的特定值

        FileAccess access = FileAccess.ReadWrite | FileAccess.Execute;Console.WriteLine("Original access: " + access); // 输出: Read, Write, Execute// 移除Write权限access &= ~FileAccess.Write;Console.WriteLine("After removing Write: " + access); // 输出: Read, Execute

        access最初被设置为ReadWrite | Execute,这意味着它包含Read、Write和Execute权限。然后,使用access &= ~FileAccess.Write;语句移除Write权限。这里,~FileAccess.Write计算出Write的按位取反值,然后&=操作确保只有Write以外的其他权限保留在access中 

如何检查枚举标志是否同时包含多个特定值 

FileAccess access = FileAccess.ReadWrite | FileAccess.Execute;// 检查是否同时具有Read和Write权限bool hasReadAndWrite = (access & FileAccess.ReadWrite) == FileAccess.ReadWrite;Console.WriteLine("Has Read and Write: " + hasReadAndWrite); // 输出: True// 检查是否同时具有Read和Execute权限bool hasReadAndExecute = (access & (FileAccess.Read | FileAccess.Execute)) == (FileAccess.Read | FileAccess.Execute);Console.WriteLine("Has Read and Execute: " + hasReadAndExecute); // 输出: True// 检查是否同时具有Write和Execute权限bool hasWriteAndExecute = (access & (FileAccess.Write | FileAccess.Execute)) == (FileAccess.Write | FileAccess.Execute);Console.WriteLine("Has Write and Execute: " + hasWriteAndExecute); // 输出: True

五、需要了解的知识点

System.FlagsAttribute 类 - .NET | Microsoft Learn

Enum.HasFlag(Enum) 方法 (System) | Microsoft Learn

位运算符和移位运算符 - 对整数类型中的单个位执行布尔(AND、NOT、OR、XOR)和移位运算 - C# reference | Microsoft Learn

System.Enum 类 - .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号1

基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,单选题20个为一组,多选题10个为一组,题库目录如下,…

腾讯云简单部署MYSQL 8.0

1.安装MySQL8.0资源库 yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm2.安装MySQL8.0 yum -y install mysql-community-server --nogpgcheck . yum -y install mysql-community-server --nogpgcheck 3.启动MySQL并配置开机自启 sys…

【效率提升】程序员常用Shell脚本

文章目录 常用Shell脚本一. 定期更新分区数据二、获取系统资源的使用情况 常用Shell脚本 一. 定期更新分区数据 在某些场景下,我们需要对N年前某一分区的数据进行删除,并添加今年该对应分区的数据,实现数据的流动式存储。 #!/bin/bash dt$…

【devops】ttyd 一个web版本的shell工具 | web版本shell工具 | web shell

一、什么是 TTYD ttyd是在web端一个简单的服务器命令行工具 类似我们在云厂商上直接ssh链接我们的服务器输入指令一样 二、安装ttyd 1、macOS Install with Homebrew: brew install ttydInstall with MacPorts: sudo port install ttyd 2、linux Binary version (recommend…

引入js的script标签如何做到异步加载

使用defer和async属性后,JavaScript加载和HTML解析之间的关系有所不同。了解这些差异可以帮助优化网页加载性能。 defer属性 行为: 当使用defer属性时,浏览器会异步加载JavaScript文件,不会阻塞HTML的解析。所有带有defer属性的…

Leetcode 3223. Minimum Length of String After Operations

Leetcode 3223. Minimum Length of String After Operations 1. 解题思路2. 代码实现 题目链接:3223. Minimum Length of String After Operations 1. 解题思路 这一题还是比较简单的,其实就是想明白对于任何一个字符,如果其个数在3个或以…

神经网络中如何优化模型和超参数调优(案例为tensor的预测)

总结: 初级:简单修改一下超参数,效果一般般但是够用,有时候甚至直接不够用 中级:optuna得出最好的超参数之后,再多一些epoch让train和testloss整体下降,然后结果就很不错。 高级:…

c++应用网络编程之五Windows常用的网络IO模型

一、Windows的网络编程 其实对开发者而言,只有Windows和其它平台。做为一种普遍流行的图形OS,其一定会与类Linux的编程有着明显的区别,这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架&#xff0…

Redis集群部署Windows版本

Redis集群 之前因为数据量的原因,并没有进行Redis集群的配置需要,现在由于数据量大,需要进行集群部署。 最初在windows系统部署,需要Redis的windows版本,但官方没有windows版本,所以需要去gitHub上找由民…

STM32 移植MQTT

在STM32上移植MQTT客户端库(如Paho MQTT C库)涉及几个关键步骤,包括库的选择、环境配置、代码集成和测试。下面是一个概括的指南,帮助你开始这个过程。 1. 选择MQTT库 对于STM32,你可以选择多个MQTT库,但…

【STM32】MPU内存保护单元

注:仅在F7和M7系列上使用介绍 功能: 设置不同存储区域的存储器访问权限(管理员、用户) 设置存储器(内存和外设)属性(可缓冲、可缓存、可共享) 优点:提高嵌入式系统的健壮…

Bash 学习摘录

文章目录 1、变量和参数的介绍(1)变量替换$(...) (2)特殊的变量类型export位置参数shift 2、引用(1)引用变量(2)转义 3、条件判断(1)条件测试结构&#xff08…

Qt+OpenCascade开发笔记(一):occ的windows开发环境搭建(一):OpenCascade介绍、下载和安装过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140604141 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

[C++进阶]模板进阶

此篇是学完stl后对于模板的补充 建议先看看这个[C初阶]模板初阶-CSDN博客 一、类模板 此处是对初阶讲过的 1. 类模板的定义格式 template<class T1, class T2, …, class Tn> class 类模板名 {}; 例如我们之前学习过的vector类&#xff1a; template<class T>…

C++中的多路转接技术之epoll

epoll 是干什么的&#xff1f;举个简单的例子 epoll的相关系统调用**epoll_create**和epoll_create1区别 epoll_ctl参数解释 **epoll_wait**参数说明返回值 epoll的使用 **epoll**工作原理epoll的优点(和 **select** 的缺点对应)epoll工作方式**水平触发**Level Triggered 工作…

Springboot 启动时Bean的创建与注入(一)-面试热点-springboot源码解读-xunznux

Springboot 启动时Bean的创建与注入&#xff0c;以及对应的源码解读 文章目录 Springboot 启动时Bean的创建与注入&#xff0c;以及对应的源码解读构建Web项目流程图&#xff1a;堆栈信息&#xff1a;堆栈信息简介堆栈信息源码详解1、main:10, DemoApplication (com.xun.demo)2…

出海收款平台有哪些?全球首要15种收付平台收费比较

在跨境电商的浪潮中&#xff0c;收款问题一直是企业面临的最大挑战之一。随着全球化贸易的不断深入&#xff0c;越来越多的外国企业希望进入中国市场&#xff0c;但受限于法律法规和支付体系的不同&#xff0c;他们往往无法直接从中国用户手中收取款项。这时&#xff0c;第三方…

HashMap与ConcurrentHashMap

文章目录 HashMap1.1 HashMap 的数据结构&#xff1f;1.2 HashMap 的动态扩容1.3 Hash实现方法1.4 如何解决Hash冲突 ConcurrentHashMap HashMap 1.1 HashMap 的数据结构&#xff1f; 哈希表结构&#xff08;链表散列&#xff1a;数组链表&#xff09;实现&#xff0c;结合数…

详细分析Springboot自定义启动界面(附Demo)

目录 前言1. banner.text1.1 配置文件关闭1.2 启动类关闭1.3 命令行关闭 2. 自定义Banner类3. 自动配置类4. 总结 前言 实现自定义启动动画是一项有趣的任务&#xff0c;虽然Spring Boot本身不提供内置的动画功能&#xff0c;但可以通过一些技巧来实现 以下主要以Demo的形式展…

三字棋游戏(C语言详细解释)

hello&#xff0c;小伙伴们大家好&#xff0c;算是失踪人口回归了哈&#xff0c;主要原因是期末考试完学校组织实训&#xff0c;做了俄罗斯方块&#xff0c;后续也会更新&#xff0c;不过今天先从简单的三字棋说起 话不多说&#xff0c;开始今天的内容 一、大体思路 我们都知…