笔记: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个人主页-哔哩哔哩视频
相关文章:
笔记:Enum中FlagsAttribute特性的用法
一、目的:分享Enum中FlagsAttribute特性的用法 在C#中,Enum(枚举)类型可以使用[Flags]属性来表示一个枚举可以存储多个值。这是通过按位运算符(如|(或)和&(与)&#…...
QWidget如何切换ui
在Qt中,QWidget及其子类用于构建图形用户界面。如果你想要在不同的UI之间切换,可以使用QStackedWidget,它可以管理一组QWidget,并且每次只显示其中一个。 以下是一个简单的例子,展示如何使用QStackedWidget切换UI&…...
web网站组成
web网站由四部分组成:浏览器 前端服务器 后端服务器 数据库服务器 流程: 1.浏览器输入网站后,向前端服务器发送请求,前端服务器响应,静态的数据给浏览器。 2.前端代码中script中有url,这个是向后台发送请求的网…...
带您详细了解安全漏洞的产生和防护
什么是漏洞? 漏洞是 IT、网络、云、Web 或移动应用程序系统中的弱点或缺陷,可能使其容易受到成功的外部攻击。攻击者经常试图寻找网络安全中的各种类型的漏洞来组合和利用系统。 一些最常见的漏洞: 1.SQL注入 注入诸如 SQL 查询之类的小代…...
【接口测试】params传参与body传参区别
文章目录 一.params传参二.body传参三.两者区别说明 一.params传参 params传参一般用于get请求 params传参时,参数会附于URL后面以问号形式展示。 示例: http://ip地址:端口号/login?usernamexm&pwd111二.body传参 body传参一般用于post请求 body传参时需…...
【docker】部署证书过期监控系统mouday/domain-admin
证书过期了再去部署证书容易被骂,就找了一个开源的证书过期系统来部署一下 过程 官方文档:https://domain-admin.readthedocs.io/zh-cn/latest/manual/install.html#docker 直接下载镜像是超时的,切换一下文档推荐的镜像源 新建docker配置…...
高级java每日一道面试题-2024年7月17日
面试官: java中都有哪些引用类型? 我回答: 强引用(Strong Reference) 描述:这是最常见和最直观的引用类型,我们通常在代码中创建的对象引用就是强引用。例如,Object obj new Object();。只要强引用存在,…...
css中如何清除浮动
在CSS中,可以使用clear:both属性来清除浮动。以下是几种常见的清除浮动的方法: 使用clearfix类:在CSS中定义一个clearfix类,并将其应用于需要清除浮动的父元素上。 .clearfix::after {content: "";display: table;cle…...
【网络】tcp_socket
tcp_socket 一、tcp_server与udp_server一样的部分二、listen接口(监听)三、accept接收套接字1、为什么还要多一个套接字(明明已经有了个socket套接字文件了,为什么要多一个accept套接字文件?)2、底层拿到新…...
Live555源码阅读笔记:哈希表的实现
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
vue3创建vite项目
一、创建vue3 vite项目: 命令行创建:npm create vitelatest vue3-tdly-demo -- --template vue (1)先进入项目文件夹,cd vue3-tdly-demo (2)之后执行, npm install (3)最后运行,npm run dev 将main.js文件内容改成…...
Maven概述
目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装,配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…...
Easyu中datagrid点击时获取所在行的数据
问题 双击单元格时,获取该行的记录内容 $(#list).datagrid({method: post,url: user/list,queryParams:{sex : "f",age : "18~25"},fitColumns: true,pageList: [ 5, 10, 15, 20 ],singleSelect: false,pagination: true,fit: true,rownumber…...
java项目中添加SDK项目作为依赖使用(无需上传Maven)
需求: 当需要多次调用某个函数或算法时,不想每次调用接口都自己编写,可以将该项目打包,以添加依赖的方式实现调用 适用于: 无需上线的项目,仅公司或团队内部使用的项目 操作步骤: 以下面这…...
区块链和数据要素融合的价值及应用
一、数据要素面临的关键障碍 在构建数据要素基石的过程中,首要任务是明确并解决产权架构的难题,特别是使用权的确立与流转机制的顺畅,此乃数字经济蓬勃发展的命脉所在。一个高效的数据流转体系对于激发数据潜能、加速经济发展及优化数据资源…...
以太坊的可扩展性危机:探索执行层的瓶颈
导读:以太坊执行层承担着交易处理、智能合约执行以及保持一致和安全状态的维护等工作。Fuel Labs 撰文解析了以太坊执行层的工作原理,及其在可扩展性方面的发展瓶颈和影响。 Fuel Labs: 执行是指在区块链上执行交易和执行状态更改所需的计算。此计算通常…...
静态解析activiti文本,不入库操作流程
说明: activiti本身状态存库,导致效率太低,把中间状态封装成一个载荷类,返回给上游,下次请求时给带着载荷类即可。 1.pom依赖 <dependency><groupId>net.sf.json-lib</groupId><artifactId>js…...
100个python的基本语法知识【上】
0. 变量和赋值: x 5 name “John” 1. 数据类型: 整数(int) 浮点数(float) 字符串(str) 布尔值(bool) 2. 注释: # 这是单行注释 ""…...
Python从0到100(四十四):读取数据库数据
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
ZLMRTCClient配置说明与用法(含示例)
webRTC播放视频 后面在项目中会用到通过推拉播放视频流的技术,所以最近预研了一下webRTC 首先需要引入封装好的webRTC客户端的js文件ZLMRTCClient.js 下面是地址需要的自行下载 http://my.zsyou.top/2024/ZLMRTCClient.js 配置说明 new ZLMRTCClient.Endpoint…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
