笔记: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, Write
        Console.WriteLine(access.HasFlag(FileAccess.Read)); // 输出: True
        Console.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个人主页-哔哩哔哩视频

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值