枚举类型与位运算

目录

  • 枚举
  • 位运算

一、枚举

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

枚举类型是值类型。

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。

当然这个基础类型也可以自己指定,可以为byte\sbyte\short\usshot\int\uintr\long\ulong

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,
}
时间: 2024-10-21 13:34:36

枚举类型与位运算的相关文章

第十五章 枚举类型和位标志

1. 概述 本章内容包括 枚举类型.位标志 以及 为枚举类型添加方法. 2. 主要内容 2.1 枚举类型 枚举类型定义了一组“符号名称/值”配对. 枚举类型的好处包括: ① 可以使程序更容易编写.阅读和维护. ② 枚举类型是强类型的,有编译器检测. 编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段. System.Enum类型有一个名为GetUnderlyingType的静态方法,返回用于容纳一个枚举类型的值的基础类型. Enum.GetUnderlyingType(typeof(

第三部分 基本类型:第15章 枚举类型和位标志

15.1 枚举类型枚举类型定义了一组“符号名称/值”配对.例如,以下Color类型定义了一组符合,每个符号表示一种颜色. internal enum Color{ White, //赋值0 Red, //赋值1 Green, //赋值2 Blue, //赋值3 Orange //赋值4 } 枚举类型的好处:枚举类型容易编写.阅读和维护.枚举类型是强类型. 派生关系:System.Object -> System.ValueType -> System.Enum -> 枚举类型 枚举类型是

枚举中的位运算

为什么枚举中位运算都可以使用并运算? 1.  什么是枚举中的位运算? 例如 int a = 1 << 0; //1左移0位    1*2^0 = 1; int b = 1 << 1; //1左移1位   1*2^1 = 2; int c = 1 << 2; //1左移2位   1*2^2 = 4; int d = 1 << 3; //1左移3位   1*2^3 = 8; 并运算 a | b 01 10 -------------- 11 ==1+2 int

第15章 枚举类型和位标志

Enumeration提供了一些非常炫酷的功能,相信大多数开发人员都不熟悉.这些新功能极大的简化了应用程序开发. 15.1枚举类型 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum Color { White,//赋值0 Red,  //赋值1 Greed,//赋值2 Blue, //赋值3 Orange//赋值4 } 当然,也可以写个程序用0代表白色,1代表红色,以此类推.但不应

C#枚举中的位运算权限分配浅谈

常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第一步, 先建立一个枚举表示所有的权限管理操作: [Flags] public enum Permissions { Insert = 1, Delete = 2, Update = 4, Query = 8 } [Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的n次方来赋值, 这样表

C#学习笔记-----C#枚举中的位运算权限分配

什么是位运算 常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 01 & 00 = 00; 2 01 | 00 = 01; 3 ~01 =0 0; 运用在权限设计中 先建立一个枚举表示所有的权限管理操作: 1 [Flags] 2 public enum Permissions 3 { 4 Insert = 1, 5 Delete = 2, 6 Update = 4, 7 Query = 8 8 } [Flags]表示该枚举可以支持C#位运算. 枚举的每一项值, 我们用2的n次

C#枚举中的位运算权限分配

什么是位运算 常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 01 & 00 = 00; 2 01 | 00 = 01; 3 ~01 =0 0; 运用在权限设计中 先建立一个枚举表示所有的权限管理操作: 1 [Flags] 2 public enum Permissions 3 { 4 Insert = 1, 5 Delete = 2, 6 Update = 4, 7 Query = 8 8 } [Flags]表示该枚举可以支持C#位运算. 枚举的每一项值, 我们用2的n次

第15章 枚举类型和位标志 15.1-15.3

Enumeration提供了一些非常炫酷的功能,相信大多数开发人员都不熟悉.而这些新功能极大的简化了应用程序的开发. 15.1枚举类型 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum Color { White,//赋值0 Red, //赋值1 Greed,//赋值2 Blue, //赋值3 Orange//赋值4 } 当然,我们也可以写个程序用0代表白色,1代表红色,以此类推.

枚举类型和位标志

一.枚举类型 编译枚举时,C#编译器把每个符号转换成类型的一个常量字段.例如将Color枚举类型看成以下代码 //编译枚举时,c#编译器把每个符号转化成类型的一个常量字段 internal struct Color : System.Enum { //以下一些公共常量,它们定义了Color的符号和值 public const Color White = (Color) 0; public const Color Red = (Color) 1; //以下是一个公共实例字段,包含Color变量的值