开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
主要介绍C#值类型中的枚举类型,枚举的作用、声明使用、默认值、实例或静态方法,以及自定义枚举的扩展方法,尤其是扩展方法,感觉非常有用。
值类型
枚举类型
枚举类型(enumeration type
或 enum 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));
获取值