当前位置: 首页 > news >正文

笔记: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.lryc.cn/news/406265.html

相关文章:

  • QWidget如何切换ui
  • web网站组成
  • 带您详细了解安全漏洞的产生和防护
  • 【接口测试】params传参与body传参区别
  • 【docker】部署证书过期监控系统mouday/domain-admin
  • 高级java每日一道面试题-2024年7月17日
  • css中如何清除浮动
  • 【网络】tcp_socket
  • Live555源码阅读笔记:哈希表的实现
  • vue3创建vite项目
  • Maven概述
  • Easyu中datagrid点击时获取所在行的数据
  • java项目中添加SDK项目作为依赖使用(无需上传Maven)
  • 区块链和数据要素融合的价值及应用
  • 以太坊的可扩展性危机:探索执行层的瓶颈
  • 静态解析activiti文本,不入库操作流程
  • 100个python的基本语法知识【上】
  • Python从0到100(四十四):读取数据库数据
  • ZLMRTCClient配置说明与用法(含示例)
  • nginx代理服务配置,基于http协议-Linux(CentOS)
  • Photos框架 - 自定义媒体资源选择器(数据部分)
  • Spring Boot + Spring Cloud 入门
  • 怎么使用动态IP地址上网
  • 【源码+文档+调试讲解】智慧物流小程序的设计与实现
  • QT:控件圆角设置、固定窗口大小
  • 【JavaScript】深入理解 `let`、`var` 和 `const`
  • 云监控(华为) | 实训学习day7(10)
  • JS_plus.key.addEventListener监听键盘按键
  • 对话系统(Chat)与自主代理(Agent)对撞
  • sql server 连接报错error 40