// 枚举
//一、枚举的优点。
// 1、枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值。
// 2、枚举使代码更易于维护,有助于确保给变量指定合法的、期望的值。
// 3、枚举使代码更易输入。
// (1)枚举的声明:枚举声明用于声明新的枚举类型。
// 访问修辞符 enum 枚举名:基础类型
// {
// 枚举成员
// }
// 基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long// 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。
// (2)枚举成员
// 枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
// 示例:
public enum TimeofDay : uint
{
Morning = -3,
Afternoon = -2,
Evening = -1
}
//产生编译时错误,原因是常数值 -1、-2 和 –3 不在基础整型 uint 的范围内。
//(3)枚举成员默认值
//在枚举类型中声明的第一个枚举成员它的默值为零。
//以后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加 1 得到的。这样增加后的值必须在该基础类型可表示的值的范围内;否则,会出现编译时错误。
// 示例:
public enum TimeofDay : uint
{
Morning,
Afternoon,
Evening
}
//Morning的值为0,Afternoon的值为1,Evening的值为2。
//(4)为枚举成员显示赋值
//允许多个枚举成员有相同的值.
//没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1.
//示例
public enum Number
{
a = 1,
b,
c = 1,
d
}
//b的值为2,d的值为2.
//注意:以上枚举值都不能超过它的基础类型范围。否则会报错.
//(5)枚举类型与基础类型的转换
//基础类型不能隐式转换为枚举类型
//枚举类型也不能隐式转换为基础类型
//示例:
public enum Number
{
a,
b,
c,
d
}
//二、枚举说明
// 1、简单枚举
// 枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。
// 枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。
// 枚举都是隐式密封的,不允许作为基类派生子类。
// 枚举类型的枚举成员均为静态,且默认为Int32类型。
// 每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。
// 如果没有明确指定底层数据类型则默认的数据类型是int类型。
// 枚举成员不能相同,但枚举的值可以相同。
// 枚举最后一个成员的逗号和大括号后面的分号可以省略
// C#提供类一个类来方便操作枚举,下面给出这个类的常用方法:
//方法 名称
//CompareTo 将此实例与指定对象进行比较并返回一个对二者的相对值的指示
//Equals 指示此实例是否等于指定的对象
//Format 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式
//GetName 在指定枚举中检索具有指定值的常数的名称
//GetNames 检索指定枚举中常数名称的数组
//GetTypeCode 返回此实例的基础 TypeCode
//GetUnderlyingType 返回指定枚举的基础类型
//GetValues 索指定枚举中常数值的数组
//HasFlag 确定当前实例中是否设置了一个或多个位域
//IsDefined 返回指定枚举中是否存在具有指定值的常数的指示
//Parse 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写
//TryParse 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值
// 示例,由枚举值获取枚举名称与由枚举名称获取枚举值
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Enum.GetName(typeof(Man), 1)); //还是 刘备 (由值获取名字)
string[] array1 = Enum.GetNames(typeof(Man));
Console.WriteLine(array1[1]); //关羽
Array array2 = Enum.GetValues(typeof(Man));
Console.WriteLine(array2.GetValue(1)); //还是关羽
Type t = Enum.GetUnderlyingType(typeof(Man));
Console.WriteLine(t); //输出 Int32
//由值获取内容
int i = 1;
string Name = Enum.Parse(typeof(Man), i.ToString()).ToString(); //此时 Name="刘备"
Console.WriteLine(Name);
//由值获取内容
string Name2 = "关羽";
int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2)); //此时 j=2
Console.WriteLine(j);
Console.ReadKey();
}
}
enum Man
{
刘备 = 1,
关羽 = 2,
张飞 = 3
}
//三、枚举的使用建议
// 当参数、返回值、变量等类型可以使枚举,尽量使用枚举(要注意考虑分类的稳定性)
// 大多数情况下都可以使用int类型枚举,下列情况除外。
// 枚举可能被大量频繁的使用,这时为了节约空间可以使用小于int类型的枚举。
// 标志枚举,且标志多于32个。