服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中FlagsAttribute属性在enum中的应用详解

C#中FlagsAttribute属性在enum中的应用详解

2022-10-12 13:23@朱较瘦 C#

这篇文章主要介绍了C#中FlagsAttribute属性在enum中的应用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Net C#中枚举的声明格式如下所示:

[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]

FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。

所谓位域 是单个存储单元内相邻二进制位的集合。

通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。

?
1
2
3
enum MyFlags { Flag1, Flag2, Flag3, Flag4};
MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3;
Console.WriteLine(myFlag);//Flag4

因为对于整数来说,| 操作就是将其转化为二进制再进行或运算。Flags.Flag2 | Flags.Flag3做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(MyFlags)3就是Flag4了

如果枚举声明如下:

?
1
2
3
4
5
6
7
[FlagsAttribute]
enum MyFlags{
   Flag1 = 0,  //000
   Flag2 = 1,  //001
   Flag3 = 2,  //010
   Flag4 = 4   //100
};

则上述结果为Flag2,Flag3,这样做的意义在于我们可以实现“或”的关系。

就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用&操作:

?
1
2
3
4
5
6
7
8
9
if((myFlag & MyFlags.Flag2) == MyFlags.Flag2)
{
   Console.WriteLine("true");
}
if((myFlag & MyFlags.Flag3) == MyFlags.Flag3)
 
{
   Console.WriteLine("true");
}

011&001 = 001,011&010 = 010,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作&运算不会有任何结果。

补充知识:C# 使用特性(Attribute)来汉化枚举类

一、新建枚举

?
1
2
3
4
5
6
7
public enum CRUD
{
  Create, 
  Retrieve,
  Update,
  Delete
}

二、新建特性类

?
1
2
3
4
5
6
7
8
public sealed class ChineseAttribute : Attribute
{
  public string Chinese { get; set; }
  public ChineseAttribute(string _chinese = "未汉化")
  {
    Chinese = _chinese;
  }
}

三、利用反射获取特性

这里我们写一个枚举类的扩展方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static string GetChinese(this Enum value)
{
  Type objType = value.GetType();
  Type attrType = typeof(ChineseAttribute);
 
  FieldInfo field = objType.GetField(value.ToString());
 
  //利用反射找是否有【Chinese】特性
  if (field.IsDefined(attrType))
  {
    var chinese = field.GetCustomAttribute<ChineseAttribute>();
    return chinese.Chinese;
  }
  //没有定义Chinese特性,直接返回具体指
  return value.ToString();
}

 

四、给枚举类添加特性

?
1
2
3
4
5
6
7
8
9
10
11
12
public enum CRUD
{
  [Chinese("创建")]
  Create,
 
  [Chinese("读取")]
  Retrieve,
 
  [Chinese]
  Update,
  Delete
}

五、测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main(string[] args)
{
  List<MyEnum.CRUD> values = new List<MyEnum.CRUD>
  {
    MyEnum.CRUD.Create,
    MyEnum.CRUD.Delete,
    MyEnum.CRUD.Retrieve,
    MyEnum.CRUD.Update
  };
 
  foreach (var item in values)
  {
    Console.WriteLine(item.GetChinese());
  }
  Console.Read();
}

效果如下

C#中FlagsAttribute属性在enum中的应用详解

以上这篇C#中FlagsAttribute属性在enum中的应用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/zhulongxi/article/details/52371853

延伸 · 阅读

精彩推荐
  • C#浅析C# 委托(Delegate)

    浅析C# 委托(Delegate)

    这篇文章主要介绍了C# 委托(Delegate)的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    菜鸟教程11672022-09-24
  • C#C# Console利用mspaint打开图像并保存的方法

    C# Console利用mspaint打开图像并保存的方法

    这篇文章主要介绍了C# Console利用mspaint打开图像并保存的方法,涉及C#调用画图板操作图片的相关技巧,需要的朋友可以参考下...

    礼拜一11242021-11-08
  • C#C#实现发送手机验证码功能

    C#实现发送手机验证码功能

    之前基于c#实现手机发送验证码功能很复杂,真正做起来也就那回事,不过就是一个post请求就可以实现的东西,今天小编把思路分享到脚本之家平台,供大...

    Larry_TH9102022-01-11
  • C#C#使用foreach循环遍历数组完整实例

    C#使用foreach循环遍历数组完整实例

    这篇文章主要介绍了C#使用foreach循环遍历数组,结合完整实例形式较为详细的分析了C#遍历数组的相关技巧,需要的朋友可以参考下...

    梦断难寻9762021-11-29
  • C#C#创建自定义控件及添加自定义属性和事件使用实例详解

    C#创建自定义控件及添加自定义属性和事件使用实例详解

    这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有...

    Im1smb8462022-09-07
  • C#C# 中的GroupBy的动态拼接问题及GroupBy<>用法介绍

    C# 中的GroupBy的动态拼接问题及GroupBy<>用法介绍

    这篇文章主要介绍了C# 中的GroupBy的动态拼接问题,在文章给大家提到了C# List泛型集合中的GroupBy<>用法详解,需要的朋友可以参考下...

    web-sec8262022-02-13
  • C#C#使用yield关键字构建迭代器详解

    C#使用yield关键字构建迭代器详解

    这篇文章主要为大家详细介绍了C#使用yield关键字构建迭代器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    绛河7402022-01-24
  • C#C#读写INI文件的方法

    C#读写INI文件的方法

    这篇文章主要介绍了C#读写INI文件的方法,涉及C#读写ini文件的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Nozer3942021-10-28