学习枚举类型/FlagsAttribute属性
网上查了下资料,发现没我想知道东西,只能自己研究一下,关于枚举的详细由于晚上还有点事,就不怎么写了下面我给大家演示一下Eum类中几种方法Enum.IsDefined,Enum.Parse,Enum.GetName,Enum.GetNames,Enum.GetValues.
先说一下System.Enum类,它是所有枚举类型的抽象基类(它是一种与枚举类型的基础类型不同的独特类型),所有的枚举类型都是从它派生的,存在所有的枚举类型和Enum类的装箱和拆箱转换。简单说一下,直接上代码了:
以下代码最好自己复制运行一下,否则可能看不明白:
using System;
public class EnumTest
{
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
class Test
{
public static void Main()
{
Type days=typeof(Days);
//演示打印一个枚举成员的枚举名
Console.WriteLine("1-{0}",Enum.GetName(days,1));
// 使用GetNames演示打印所有枚举名:
string[] enumNames = Enum.GetNames(days);//获取所有枚举名
for (int i = 0; i < enumNames.Length; i++)
{
Console.WriteLine("{0}-{1}",i,enumNames[i]);
}
//演示使用GetValue获取并打印所有枚举值
int[] enumValues = (int[])Enum.GetValues(days);
for (int i = 0; i < enumValues.Length; i++)
{
Console.WriteLine("{0}-{1}",enumValues[i],(Days)i);
}
//演示使用IsDefined判断枚举中是否存在具有指定枚举值
Console.WriteLine("Enum.IsDefined={0}",Enum.IsDefined(days,8));
//现在演示Enum.Parse
//将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
for(int i=0;i<enumNames.Length;i++)
{
Console.WriteLine("{0}-{1}",i,Enum.Parse(days,i.ToString()));
//等价于
//Console.WriteLine("{0}-{1}", (int)(Enum.Parse(days,i.ToString())), Enum.Parse(days,i.ToString()));
//也等价于
// Console.WriteLine("{0}-{1}",i,enumNames[i]);
}
Console.ReadKey();
}
}
}
public class EnumTest
{
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
class Test
{
public static void Main()
{
Type days=typeof(Days);
//演示打印一个枚举成员的枚举名
Console.WriteLine("1-{0}",Enum.GetName(days,1));
// 使用GetNames演示打印所有枚举名:
string[] enumNames = Enum.GetNames(days);//获取所有枚举名
for (int i = 0; i < enumNames.Length; i++)
{
Console.WriteLine("{0}-{1}",i,enumNames[i]);
}
//演示使用GetValue获取并打印所有枚举值
int[] enumValues = (int[])Enum.GetValues(days);
for (int i = 0; i < enumValues.Length; i++)
{
Console.WriteLine("{0}-{1}",enumValues[i],(Days)i);
}
//演示使用IsDefined判断枚举中是否存在具有指定枚举值
Console.WriteLine("Enum.IsDefined={0}",Enum.IsDefined(days,8));
//现在演示Enum.Parse
//将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
for(int i=0;i<enumNames.Length;i++)
{
Console.WriteLine("{0}-{1}",i,Enum.Parse(days,i.ToString()));
//等价于
//Console.WriteLine("{0}-{1}", (int)(Enum.Parse(days,i.ToString())), Enum.Parse(days,i.ToString()));
//也等价于
// Console.WriteLine("{0}-{1}",i,enumNames[i]);
}
Console.ReadKey();
}
}
}
FlagsAttribute 类
FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理,所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要,我先了解下两条基本准则,以后在研究。1.只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义属性。2. 必须用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。
下面看下我的举例,很简单拿个计算器试试就明白了。
using System;
class FlagsAttributeDemo
{
enum Color1 : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};
[FlagsAttribute]
enum Color2 : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};
static void Main()
{
Console.WriteLine("测试未使用FlagsAttribute属性");
Color1 MyColor1 = Color1.Red | Color1.Blue & Color1.Green;
//我先不运行计算一下看看是那个:0001|0100&0010=0001 应该是Red
Console.WriteLine("MyColor1={0}", MyColor1);
Color1 MyColor_1 = Color1.Red | Color1.Blue;
//我先不运行计算一下看看是那个:0001|0100=0101 应该是5
Console.WriteLine("MyColor_1={0}",MyColor_1);
Console.WriteLine("测试使用FlagsAttribute属性");
Color2 MyColor2 = Color2.Red | Color2.Blue;
//我先不运行计算一下看看是那个:0001|0100=0101应该是Red,Blue
Console.WriteLine("MyColor2={0}", MyColor2);
Console.ReadKey();
}
}
class FlagsAttributeDemo
{
enum Color1 : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};
[FlagsAttribute]
enum Color2 : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};
static void Main()
{
Console.WriteLine("测试未使用FlagsAttribute属性");
Color1 MyColor1 = Color1.Red | Color1.Blue & Color1.Green;
//我先不运行计算一下看看是那个:0001|0100&0010=0001 应该是Red
Console.WriteLine("MyColor1={0}", MyColor1);
Color1 MyColor_1 = Color1.Red | Color1.Blue;
//我先不运行计算一下看看是那个:0001|0100=0101 应该是5
Console.WriteLine("MyColor_1={0}",MyColor_1);
Console.WriteLine("测试使用FlagsAttribute属性");
Color2 MyColor2 = Color2.Red | Color2.Blue;
//我先不运行计算一下看看是那个:0001|0100=0101应该是Red,Blue
Console.WriteLine("MyColor2={0}", MyColor2);
Console.ReadKey();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?