C# 枚举 enum

在 C# 中,枚举 用于将常量名称分配给一组数字整数值。 它使常量值更具可读性,例如,当引用一周中的某一天时,WeekDays.Monday 比数字 0 更具可读性。

枚举是使用 enum 关键字直接在命名空间、类或结构中定义的。 所有常量名都可以在大括号内声明并用逗号分隔。 以下定义了工作日的枚举。

enum WeekDays
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

上面, WeekDays 枚举在每行中声明成员,以逗号分隔。

枚举值

如果未将值分配给枚举成员,则编译器将默认为每个成员分配整数值,默认情况下从零开始。 枚举的第一个成员将为 0,并且每个后续枚举成员的值都增加 1。

enum WeekDays
{
    Monday,     // 0
    Tuesday,    // 1
    Wednesday,  // 2
    Thursday,   // 3
    Friday,     // 4
    Saturday,   // 5
    Sunday      // 6
}

您可以为枚举成员分配不同的值。 枚举成员默认值的更改将自动按顺序将增量值分配给其他成员。

enum Categories
{
    Electronics,    // 0
    Food,           // 1
    Automotive = 6, // 6
    Arts,           // 7
    BeautyCare,     // 8
    Fashion         // 9
}

您甚至可以为每个成员分配不同的值。 (推荐用这种方式)

enum Categories
{
    Electronics = 1,  
    Food = 5, 
    Automotive = 6, 
    Arts = 10, 
    BeautyCare = 11, 
    Fashion = 15,
    WomanFashion = 15
}

枚举可以是任何数字数据类型,例如 byte、sbyte、short、ushort、int、uint、long 或 ulong。 但是,枚举不能是字符串类型。

将枚举名称后的类型指定为:类型。 下面定义了字节枚举。

enum Categories: byte
{
    Electronics = 1,  
    Food = 5, 
    Automotive = 6, 
    Arts = 10, 
    BeautyCare = 11, 
    Fashion = 15
}

如何访问枚举

可以使用打点语法访问枚举: enum.member

enum WeekDays
{
    Monday, 
    Tuesday,
    Wednesday,
    Thursday, 
    Friday, 
    Saturday,
    Sunday 
}

Console.WriteLine(WeekDays.Monday); // Monday
Console.WriteLine(WeekDays.Tuesday); // Tuesday
Console.WriteLine(WeekDays.Wednesday); // Wednesday
Console.WriteLine(WeekDays.Thursday); // Thursday
Console.WriteLine(WeekDays.Friday); // Friday
Console.WriteLine(WeekDays.Saturday); // Saturday
Console.WriteLine(WeekDays.Sunday); // Sunday

转换

需要显式转型才能从枚举类型转换为其底层整数类型。

enum WeekDays
{
    Monday, 
    Tuesday,
    Wednesday,
    Thursday, 
    Friday, 
    Saturday,
    Sunday 
}

Console.WriteLine(WeekDays.Friday); //输出: Friday 
int day = (int) WeekDays.Friday; // enum to int conversion
Console.WriteLine(day); //输出: 4 
		
var wd = (WeekDays) 5; // int to enum conversion
Console.WriteLine(wd);//输出: Saturday 

位标志 FlagsAttribute

枚举同样可以用来表示 位标记。 这个时候枚举值一般从1开始。下一个都是前面的2倍。我们可以用0x来方便定义它。 同样我们也可以用位运算符对它进行运算。 如下 我们定义了一个权限枚举 (使用的是unit 可以容纳32位,UInt64的话就可以64位了)

    [Flags]
    public enum PermissionType : uint
    {
        Product = 1, // 0b_0001,
        Category = 2, // 0b_0010  也可以用左移运算符 1 << 1
        Order = 4, // 0b_0100        1 << 2 
        Blog = 8, // 0b_1000      也可以用左移运算符 1 << 3 
        m = 0x10,
        a = 0x20,
        l = 0x40,
        ma = 0x80,
        dot = 0x100,
        net = 0x200,
        kk = 0x400,
        ll = 0x800,
        mm = 0x1000,
        n = 0x2000,
        max = 0x80000000,
        //max = 0b_1000_0000_0000_0000_0000_0000_0000_0000,
    }

| 运算

class Program
{
    static async Task Main(string[] args)
    {
        var type = PermissionType.Product | PermissionType.Category;
        Console.WriteLine(type); // 输出了 Product, Category  如果没有加Flags attribute的话,这种不存在枚举值,是会输出 3。
        Console.WriteLine((int)type); // 3
    }
}

判断是否有这个标记位

使用HasFlag方法,我们就可以用来判断这个标记位是不是存在。(在权限这边就意味着有权限了)

 class Program
    {
        static async Task Main(string[] args)
        {
            var type = PermissionType.Product | PermissionType.Category;
            Console.WriteLine(type.HasFlag(PermissionType.Product)); //true
            Console.WriteLine(type.HasFlag(PermissionType.Order)); //false
            //如果 没有这个方法的话则也可以用下面的方法来判断

            Console.WriteLine((type & PermissionType.Product) == PermissionType.Product); // true;
            Console.WriteLine((type | PermissionType.Product) == type); // true;
            Console.ReadKey();
        }
    }

移除某个标记位

    class Program
    {
        static async Task Main(string[] args)
        {
            var type = PermissionType.Product | PermissionType.Category | PermissionType.Blog;
            type &= ~PermissionType.Product;
            Console.WriteLine(type);//Category, Blog
        }
    }
下一篇:C# StringBuilder
最近更新的
...