• 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类型
  • 相关阅读:
    关于Spring的69个面试问答——终极列表
    阿里内部分享:我们是如何?深度定制高性能MySQL的
    转载:SqlServer数据库性能优化详解
    SQL Server 中WITH (NOLOCK)浅析
    使用druid连接池带来的坑testOnBorrow=false
    opencms9.0安装
    POJ 1201-Intervals(差分约束系统)
    SQL Server 为代码减负之存储过程
    XMPP系列(四)---发送和接收文字消息,获取历史消息功能
    【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
  • 原文地址:https://www.cnblogs.com/whx1973/p/enum.html
Copyright © 2020-2023  润新知