.NET/C#基础之枚举、枚举默认值、枚举扩展方法

191 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

主要介绍C#值类型中的枚举类型,枚举的作用、声明使用、默认值、实例或静态方法,以及自定义枚举的扩展方法,尤其是扩展方法,感觉非常有用。

值类型

枚举类型

枚举类型(enumeration typeenum type)是由基础的整数类型组成的名称集合而定义的值类型。通常用来表示一组常量。

所有枚举类型都隐式地继承 System.Enum 类型, System.Enum 类型是继承自 System.ValueType 类型的唯一不为值类型的引用类型。

枚举介绍和使用

枚举表示全部、所有的取值或选择,对应于现实世界,有很多的对应数据,比如 一年的四季、人的性别、受教育的学历等。

通过enum关键字并指定枚举的成员名,就可以声明一个枚举类型。

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Season 是一个枚举类型。枚举类型的使用非常简单,直接使用枚举名.成员名即可:

Console.WriteLine(Season.Spring);
Console.WriteLine(Season.Autumn);

// 输出
// Spring
// Autumn

枚举由成员名组成,每个成员名实际是一个整数,其关联的值默认从 0 开始,然后依据成员名的顺序依次增加1。

也就是上面的枚举Season,其成员Spring表示0,Summer表示1 ...

枚举类型的基类型是除 Char 外的任何整型,所以枚举类型的值是整型值。

下面的代码,将枚举转换为int类型查看:

Console.WriteLine((int)Season.Spring);
Console.WriteLine((int)Season.Autumn);

// --- 输出
// 0
// 2

可以显式的指定枚举成员对应的整数值。

比如,Season 的成员 Summer 为 -2,Winter 为 10:

enum Season
{
    Spring,
    Summer=-2,
    Autumn,
    Winter=10
}

则 Spring 为默认的 0,Autumn 为 Summer 后递增的 -1

Console.WriteLine((int)Season.Spring);  0
Console.WriteLine((int)Season.Summer);  -2
Console.WriteLine((int)Season.Autumn);  -1
Console.WriteLine((int)Season.Winter);  10

枚举的默认值

枚举类型E的默认值为(E)0,也就是为 0 枚举,即使枚举成员对应的整数没有0

default(Type) 获取一个类型的默认值。

对于枚举:

public enum Season
{
    Spring=10,
    Summer,
    Autumn,
    Winter
}

其成员没有对应的0,获取其默认值 如下:

Console.WriteLine($"枚举默认值:{default(Season)}");
Console.WriteLine($"枚举默认值:{(int)default(Season)}");

// --- 输出
// 枚举默认值:0
// 枚举默认值:0

如果是 有对应0 的成员的 枚举 Season :

Console.WriteLine($"枚举默认值:{default(Season)}");
Console.WriteLine($"枚举默认值:{(int)default(Season)}");

// --- 输出
// 枚举默认值:Spring
// 枚举默认值:0

枚举(成员)的扩展方法

枚举类型内不能定义方法,但是,可以通过扩展方法,为枚举添加功能操作。

如下,对于枚举Season,添加扩展方法EnumExtMethod

public enum Season
{
    Spring,
    Summer = -2,
    Autumn,
    Winter = 10
}

public static class ExtenMethod
{
    public static void EnumExtMethod(this Season season)
    {
        Console.WriteLine($"我是 enum 枚举类型 {season.GetType().Name} 的扩展方法。我的值是{season}{(int)season}");
    }
}

这样,就实现了为枚举添加功能(方法)。

调用方法,查看输出:

// 调用枚举的扩展方法
Season.Autumn.EnumExtMethod();

// --- 输出
// 我是 enum 枚举类型 Season 的扩展方法。我的值是Autumn:-1

可以看到扩展方法的调用是通过枚举成员Season.Autumn执行的。也就是,枚举成员是枚举类型的一个取值。

var.GetType() 获取一个变量的类型数据。

typeof(Type) 获取一个类型的类型数据。

枚举实例的Equals和CompareTo方法

用于比较枚举值的方法:

Console.WriteLine($"CompareTo:{Season.Spring.CompareTo(Season.Winter)}");
Console.WriteLine($"CompareTo:{Season.Autumn.CompareTo(Season.Summer)}");
Console.WriteLine($"CompareTo:{Season.Autumn.CompareTo((Season)2)}");

Console.WriteLine($"Equals:{Season.Spring.Equals(0)}");
Console.WriteLine($"Equals:{Season.Spring.Equals(Season.Spring)}");

输出:

CompareTo:-1
CompareTo:1
CompareTo:0
Equals:False
Equals:True

Equals 比较的是实例是否是同一个实例,即是否位于同一内存地址(同一个内容);

CompareTo比较的是值,两个实例的值是否相等。

Enum.GetNames 获取枚举类型的所有成员

foreach (var name in Enum.GetNames(typeof(Season)))
{
    Console.WriteLine(name);
}

Spring
Summer
Autumn
Winter
Console.WriteLine(Enum.GetName(typeof(Season),1)); // Summer

Enum.GetValues(typeof(Season)); 获取值

参考