• 枚举类型与位运算


    目录

    • 枚举
    • 位运算

    一、枚举

    枚举类型是名称与值的组合。

    枚举类型是值类型。

    1、为什么枚举类型是名称与值得组合?有时我只看到键名称,没有看到相对的值。

    public enum Options
    {
                Insert,
                Update,
                Save,
                Delete,
                Query
    }

    编译器会给上面补充完整

    public enum Options
    {
                Insert=0,
                Update=1,
                Save=2,
                Delete=3,
                Query=4
    }

    默认从0开始,依次赋值。

    2、为什么枚举类型是值类型

    因为System.Enum派生于System.ValueType,而System.ValueType直接派生自System.Object

    编译器遇到枚举类型时,会有自己的理解:

    internal struct Options:System.Enum
     {
                public const Options Insert = (Options)0;
                public const Options Update = (Options)1;
                public const Options Save = (Options)2;
                public const Options Delete = (Options)3;
                public const Options Query = (Options)4;
                public int value__;
    }

    虽然Enum类型不能继承,但是可以看出编译器对待枚举类型所形成自己的理解,让我们明白其原理。

    3、操作枚举类型

    (1) GetUnderLyingType:返回容纳一个枚举类型的值的基础类型

    每个枚举类型都有一个基础类型,默认是int.所以上面编译器默认为我们填充int类型的值0~4。

    当然这个基础类型也可以自己指定,可以为bytesbyteshortusshotintuintrlongulong

    public enum Options:byte
    {
                Insert,
                Update,
                Save,
                Delete,
                Query
    }
    var type= Enum.GetUnderlyingType(typeof(Options));
    
     string strs = type.ToString();

    枚举类型是基元类型,我们可以对其实例进行许多平时的操作符操作,而每个枚举实例,对应着value__字段。

    (2)GetValues:获取一个数组,该数组的每个元素都包含钙元素的名称和对应的值。

    System.Collections.Generic.Dictionary<int,string> opsDic=new     System.Collections.Generic.Dictionary<int,string>();
    Options[] ops = (Options[])Enum.GetValues(typeof(Options));
    foreach (var o in ops)
    {
                    try
                    {
                        opsDic.Add((int)o, o.ToString());
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("键值{0}已存在", (int)o);
                    }
    }    


    (3)GetNames:返回一组字符串名称数组。

    string[] opsNames = Enum.GetNames(typeof(Options)); 

    (4)Parse和TryParse:可以将数值和名称的字符串转换成对应的枚举类型。

    Options turnOption = (Options)Enum.Parse(typeof(Options), "Insert");
    Options turnOption1 = (Options)Enum.Parse(typeof(Options), "1");
    Options tryTurnOption;
    Enum.TryParse<Options>("insert", false, out tryTurnOption);


    二、位标志

    我们可能需要多个枚举的组合来满足我们的需要。

    位运算是针对二进制位进行的运算,常用的位运算主要有与(&), 或(|)和非(~)   

    e.m:1 & 0 = 0, 1 | 0 = 1, ~1 = 0

    要使枚举类型具有位运算的能力,需要加上特性[FlagsAttribute]简写[Flags]。有些位处于on状态,有些处于off状态。所以通常在定义一个None=0的枚举符号。相对应的值都为2的指数倍。为的是后续的运算。

    [Flags]
    public enum Options
    {
                None=0,
                Insert = 1, //二进制: 0001
                Update = 2, //二进制: 0010
                Save = 4,   //二进制: 0100
                Delete = 8, //二进制: 1000
                Query = 16  //二进制:10000
    }

    权限列表:

    Options hasOps = Options.Insert | Options.Update;
    string ops = hasOps.ToString();

    我们看到, Options.Insert | Options.Update=0001|0010,“|”与操作:1 | 0 = 1,是二进制位的运算。我们可以得到结果为:0011。对于这个结果怎么去应用。

    权限判断:

    if ((hasOps & Options.Insert) == Options.Insert)
    {
                    Console.WriteLine("Has {0}", Options.Insert);
    }

    我们可以根据“&”与操作进行权限判断,可以表示为:0011&0001=0001,后面0001==0001,符合条件,有Insert权限。

    实例:项目中,有时会进行正则匹配。

    string[] imgsArr = Regex.Split(imgsArea, ",", RegexOptions.IgnoreCase | RegexOptions.Multiline);   这句话主要看后面:RegexOptions.IgnoreCase | RegexOptions.Multiline,可以表示为:0001|0010=0011,意思也就是需要同时符合两个条件,

    :RegexOptions.IgnoreCase不区分大小写匹配 和 RegexOptions.Multiline 多行模式匹配

    [Flags]
    public
    enum RegexOptions { None = 0, IgnoreCase = 1, Multiline = 2, ExplicitCapture = 4, Compiled = 8, Singleline = 16, IgnorePatternWhitespace = 32, RightToLeft = 64, ECMAScript = 256, CultureInvariant = 512, }
  • 相关阅读:
    linux 下源码编译环境配置
    CentOS服务器初始化设置
    CentOS-7系统安装配置
    .Net Core 商城微服务项目系列(三):Ocelot网关接入Grafana监控
    .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关
    .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证
    Docker系列(一):容器监控工具Weave Scope安装
    eShopOnContainers学习系列(二):数据库连接健康检查
    eShopOnContainers学习系列(一):Swagger的使用
    ELK系列(二):.net core中使用ELK
  • 原文地址:https://www.cnblogs.com/sunchong/p/4442352.html
Copyright © 2020-2023  润新知