学习枚举类型/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();
        }
    }
}

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();
    }
}

 
 
原文地址:https://www.cnblogs.com/rohelm/p/2384103.html