zoukankan      html  css  js  c++  java
  • 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类型
  • 相关阅读:
    redis_03 _ 高性能IO模型:为什么单线程Redis能那么快
    redis_02 _ 数据结构:快速的Redis有哪些慢操作?
    redis-01 _ 基本架构:一个键值数据库包含什么?
    mysql_28 _ 读写分离有哪些坑
    mysql_27 _ 主库出问题了,从库怎么办
    小程序的转发功能
    简单几何(求交点) UVA 11178 Morley's Theorem
    测试开发CICD——Docker——windows8上环境安装
    测试开发进阶——spring boot——MVC——MyBatis初步了解(转载)
    BZOJ 2226 [Spoj 5971] LCMSum
  • 原文地址:https://www.cnblogs.com/whx1973/p/enum.html
Copyright © 2011-2022 走看看