标志枚举
public enum Emergency
{
A = 1,
B = 2,
C = 4,
D = 8
}
public class UnitTest1
{
[Fact]
public void Test1()
{
var a = Emergency.A | Emergency.B; //变量a为 3
var b = Emergency.B | Emergency.D; //变量b为10
var aa = a.HasFlag(Emergency.A);//true ,a 包含枚举A
var bb = a.HasFlag(Emergency.C);//false , a 不包含枚举C
}
}
我们发现定义的枚举都是2的指数,因为2的指数任意结合产生的结果值都不可能重复(不信自己试)。反过来,我们就可以根据结果值推算出包含的枚举。
为什么用位位运算符?位运算的四种结果:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
也就是:
Emergency.A | Emergency.B| Emergency.B| Emergency.B;//不管怎么加都是 3 (如果使用 + 会一直累计)
为什么说任意结合合产生的结果值都不可能重复?
计算机只认识0和1。
下面我们对十进制和二进制做个对应:
1 -> 0001
2 -> 0010
4 -> 0100
8 -> 1000
这样我们更加形象的知道为什么2的指数结合不会有重复,且重复结合不累计。
一般用标记枚举我们都会在枚举上加一个Flags特性
[Flags]
public enum Emergency
{
A = 1,
B = 2,
C = 4,
D = 8
}
public class UnitTest1
{
[Fact]
public void Test1()
{
var a = Emergency.A | Emergency.B; //变量a为 A | B
var b = Emergency.B | Emergency.D; //变量b为 B | D
var aa = a.ToString();//变量aa为 "A,B"
var bb = a & (~Emergency.A);//从组合状态中去掉一个元素A ,结果为 枚举 B
var cc = (b & Emergency.B) != 0;//检查组合状态是否包含枚举B 和b.HasFlag(Emergency.B)应该是等效的啊~~
应用和注意:
- 一般可用于参数、属性等用来保证强类型
- 可用于权限叠加、权限判断(一个int就可以表示多个权限)
- 推荐给枚举提供一个None=0的枚举值
- 记得是2的指数
转自:http://note.youdao.com/share/?id=fada4ddcb49bdc068c85eb5c3d0bc93a&type=note#/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决