Enum中的Flags特性
1、一般的枚举,如:
Public enum OrderStatus { Pending=0, Open=1, Complete=2 }
在某一时刻OrderStatus只能是这些枚举中的任意一个值。
2、如果我们想要这个枚举的复合值呢?
即枚举在某一个时刻既有A值又有B值,这时枚举就需要Flags标志
FlagsAttribute 类
指示可将枚举视为位域(即一组标志)。
C# Flags Enum语法:
添加某项用"|"
移除某项用"~"
判断是否存在某项用HasFlag或"&"
SqlServer Flags Enum语法:
添加某项用"|":
SELECT 0|1|2 --3
移除某项用"^"
SELECT 0|1|2^2 --1
判断是否存在某项用"&":
SELECT 0|1|2&2 --2
下面在LinqPad中创建一个Demo,创建一个URNRenewal枚举
用户示例:
场景1:URN 30天内即将过期发送邮件给客户A,发送后设置标志位RenewalNoticeSend
场景2:客户A收到30天内URN过期提醒,重置了过期时间需要设置标志位ExpirationDateChange,移除标志位RenewalNoticeSend、ExpiredNoticeSend
场景3:客户A重置了过期时间需要发送邮件给客户B,发送后设置标志位ExtensionNoticeSend
场景4:URN已过过期时间需要发送邮件给客户C,发送后设置标志位ExpiredNoticeSend
实际场景1:
系统发送了30天内即将过期的邮件给客户A,客户A什么也没有做。30天过后系统又发送了URN过期邮件给客户C。这时标志位既包含RenewalNoticeSend又包含ExpiredNoticeSend
[Flags] public enum URNRenewal { /// <summary> /// 初始值 /// </summary> NONE = 0, /// <summary> /// 30天提醒已发 /// </summary> RenewalNoticeSend = 1, /// <summary> /// 发送提醒后已修改ExpirationDate /// </summary> ExpirationDateChange = 2, /// <summary> /// 修改ExpirationDate后提醒邮件已发 /// </summary> ExtensionNoticeSend = 4, /// <summary> /// URN Expired Notice Email已发 /// </summary> ExpiredNoticeSend = 8 }
void Main()
{
//Uniform Registration Number
var URNFlag = URNRenewal.NONE;
//实际场景1:系统发送了30天内即将过期的邮件给客户A,客户A什么也没有做。30天过后系统又发送了URN过期邮件
给客户C。这时标志位状态是RenewalNoticeSend|ExpiredNoticeSend=9
//Flag Enum添加某项用"|"
//Flag Enum移除某项用"~"
//Flag Enum判断是否存在某项用HasFlag或"&"
URNFlag = URNRenewal.RenewalNoticeSend | URNRenewal.ExpiredNoticeSend;
// See if RenewalNoticeSend flag is set.
if(URNFlag.HasFlag(URNRenewal.RenewalNoticeSend))
{
"RenewalNoticeSend Flag Include".Dump();
}
// See if RenewalNoticeSend flag is set.
if((URNFlag & URNRenewal.RenewalNoticeSend)== URNRenewal.RenewalNoticeSend)
{
"RenewalNoticeSend Flag Include".Dump();
}
//如果想要移除某个Flag,例如移除ExpiredNoticeSend
URNFlag &= ~URNRenewal.RenewalNoticeSend;
// See if RenewalNoticeSend flag is set.
if(!URNFlag.HasFlag(URNRenewal.RenewalNoticeSend))
{
"RenewalNoticeSend Flag Removed".Dump();
}
//数据库中关于Enum Value的位运算与C#相同如
//SqlServer
//添加某项用"|":SELECT 0|1|2 =3
//移除某项用"^"SELECT 0|1|2^2 =1
//判断是否存在某项用"&":SELECT 0|1|2&2 =2
}
参考:
分类:
C#基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构