CLR via C# 读书笔记 枚举类型

类型定义:

枚举类型(enumerated types)定义了一组“符号名称/值”配对

示例:

internal enum Color{
    White,       //默认赋值0
    Red,         //赋值为1
    Green,       //赋值为2
    Blue,        //赋值为3
    Orange       //赋值为4
}

类型本质:

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

public abstract class Enum:ValueType, IComparable,IFormattable,IConvertible

从定义中可以得出一下结论:

  • System.Enum为引用类型,并且是一个抽象类
  • System.Enum类型继承自System.ValueType类型,System.Enum类型是System.ValueType的特例,其他所有继承自System.ValueType的类型都为值类型
  • System.Enum类型实现了IComparable,IFormattable,IConvertible接口

System.Enum枚举类型提供了共用方法,所有枚举类型均为值类型,分配于线程的堆栈上,System.Enum类型为引用类型,分配于托管堆上。枚举类型有别于其他值类型,不能定义任何方法、属性、事件

 

枚举规则:

下面的枚举定义与开头略有不同

internal enum Week : int {
    Sun =  7, 
    Mon = 1,  
    Tue,
    Wed,
    Thur,
    Fri,
    Sat,
    Weekend = Sun
}
  • 枚举定义时可以声明其基类型,枚举声明的类型只能是除char外的8种整数类型:byte、sbyte、short、ushort、int、uint、long和ulong
  • 枚举成员是枚举类型的命名常量,任意两个枚举常量不能具有相同的名称符号,但是可以具有相同的关联值
  • 枚举成员会显示和隐式与整数值相关联,默认第一个元素对应的隐式值为0,然后依次递增1,可以显示的设置关联值

 

常用方法:

Enum.GetUnderlyingType方法返回用于容纳一个枚举类型的值的基础类型

代码演示

internal enum Color : byte {
    White,
    Red,
    Green,
    Blue,
    Orange
}
//以下代码显示"System.byte"
Console.WriteLine(Enum.GetUnderlyingType(typeof(Color)));

ToString()方法

Color c = Color.Blue;                            
Console.WriteLine(c);                   //"Blue" (常规格式)
Console.WriteLine(c.ToString());        //"Blue" (常规格式)
Console.WriteLine(c.ToString("G"));     //"Blue" (常规格式)
Console.WriteLine(c.ToString("D"));     // “3” (十进制格式)
Console.WriteLine(c.ToString("X"));     // "03"(16进制格式)

System.Enum的静态方法GetValues和GetNames分别获取枚举中所有符号的数组和符号名称数组

foreach(string item in Enum.GetValues(typeof(Week))){
    
    Console.WriteLine("{0} : {1}",item.ToString("D"),item.ToString());

}

foreach(string item in Enum.GetNames(typeof(Week))){
    
    Console.WriteLine(item.ToString());

}

 Parse和TryParse 将符号转换为枚举类型的实例

Color c=(Color) Enum.Parse(typeof(Color),"orange",true);

Enum.TryParse<Color>("1",false,out c);

Enum.IsDefined方法判断一个值对于一个枚举类型是否合法

//显示为“True”,因为Color将Red定义为1
Console.WriteLine(Enum.IsDefined(typeof(Color),1));

//显示为“True”,因为Color将White定义为0
Console.WriteLine(Enum.IsDefined(typeof(Color),"White"));

//显示为“False”,因为执行的是区分大小写的检查
Console.WriteLine(Enum.IsDefined(typeof(Color),"white"));

//显示为“False”,因为Color没有和值10 对应的符号
Console.WriteLine(Enum.IsDefined(typeof(Color),10));

 

枚举的意义

  • 枚举类型是代码更具有可读性
  • 枚举类型是强类型的
  • 枚举的声明类型,必须是基于编译器的基元类型,而不能是对应的FCL类型
原文地址:https://www.cnblogs.com/whx1973/p/enum.html