详细了解C# 枚举与位枚举

一、枚举的概念:

  C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型);

二、枚举的定义:

  声明enum变量:

enum <enum_name> {enumeration list};

  其中enum_name 指定枚举的类型名称;  enumeration list 是一个用逗号分隔的标识符列表;

  枚举列表中的每个符号代表一个整数值,一个比他前面的符号大的整数值。默认情况下,第一个枚举符号的值是0.例如:

enum Days {Sun , Mon, tue, Fir, sat };

三、枚举的案例,枚举变量的用法:

using System;
namespace EnumApplication
{
 class EnumProgram
 {
   enum Days { Sun, Mon, tue, Wed, thu, Fri, sat };

   static void Main(string[] args)
   {
    int WeekdayStart = (int)Days.Mon;
    int WeekdayEnd = (int)Days.Fir;
    Console.WriteLine("Monday:{0}",WeekdayStart);
    Console.WriteLine("Firday:{0}",WeekdayEnd );
    Console.ReadKey();
   }
 }
}

四、Enum类:

  所有枚举类型都隐式地继承System.Enum 类型, System.Enum 类型是继承自System.ValueType类型唯一不为值类型的引用类型;

五、Enum 类:

方法 描述
CompareTo 将此实例与指定对象进行比较并返回一个对二者的相对值的指示
Equals:指示此实例是否等于指定的对象;
Format 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式
GetName 在指定枚举中检索具有指定值的常数的名称
GetNames 检索指定枚举中常数名称的数组
GetTypeCode 返回此实例的基础TypeCode
GetUnderlyingTye 返回指定枚举的基础类型
GetValues 指定枚举中常数值的数组
HasFlag 确定当前实例中是否设置了一个或多个位域
IsDefined 返回指定枚举中是否存在具有指定值的常数的指示
Parse 将一个或多个枚举常数的名称或数字值得字符串表示转换成等效得枚举对象,一个参数指定该操作是否不区分大小写
TryParse 将一个或多个枚举常数得名称或数字值得字符串表示转换成等效得枚举对象,用于指示转换是否成功得返回值

六、标志枚举/位枚举:

  C# 标记枚举(Flags):枚举类型是用于声明一组命名得常数得基本类型数据(值类型)。

  枚举值是互斥得。而位标记集合是一种由组合出现得元素形成得列表,通常设计为以“位或”运算组合新值;

  枚举类型则通常表达一种语义相对独立得数值集合。而以枚举类型来实现位标记集合是最完美得组合,简称位枚举。

七、位枚举得定义: 

///<summary>
  /// 权限枚举
  ///</summary>
  [Flags]
  public enum permission                     注意加了[Flags]特性后有三种写法,
  {                                  一种是使用<<符号,
    Unknown = 0; // 也可以写成0x00或0             第二种是0x01,                
                                    还有一种是直接写0,1,2,4,8....,
    Create = 1<<0, // 0x01或1                 一般来说是2的n次方来表示。  
                                    注:<<左操作符,表示对这个数进行移位。
   Read = 1<<1, //0x02或2

    Update = 1<<2, //0x04或4

    Delete = 1<<3 //0x08或8
  }

八、位枚举的实例:

//1、给用户创建、读取,修改和删除的权限
var parmission = Permission.Create | parmission.Read | parmission.Update | parmission.Delete;

//2、去掉用户的修改和删除权限
parmission = parmission &~parmission.Update;
parmission = parmission &~parmission.Delete;

//3、给用户加上修改的权限
parmission = parmission | parmission.Update;

//4、判断用户是否有创建的权限
var isCreate = (parmission & parmission.Create)!=0;
//或者
var isCreate = (parmission & parmission.Create)==parmission.Create;
  这时parmission枚举的值将变成0+1+4=5,它的ToSting()将变成“parmission.Create,
  parmission.Read”,parmission.Update; 这里我们可以解释为什么第五个值Delete是8而不能成为5。
  也就是说它的值不应该是前几项值的复合值。一个比较简单的方法
  就是用2的n次方来依次位每一项赋值,例如:1,2,4,8,16,32,64.......。

以上就是详细了解C# 枚举与位枚举的详细内容,更多关于C# 枚举与位枚举的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#中可枚举类型详解

    枚举是迭代一个集合中的数据项的过程. 我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有Get方法,哈希表和字典有键和值..........其实他们都已经实现了IEnumerable和IEnumerator接口.所以一切的集合和数组都可以用IEnumerable或者IEnumerable<T>接口来定义. IEnumerabl

  • C#如何给枚举类型增加一个描述特性详解

    前言 相信很多人对枚举并不陌生,枚举可以很方便和直观的管理一组特定值.如果我们在页面上直接输出我们希望匹配的汉语意思或则其他满足我们需求的语句就更好了,当然,通常小伙伴们都会再页面上if(enum==1) "我是一个枚举"或者switch(enum)这种方式解决. 枚举的优点: <1>枚举可以使代码更易于维护,有助于确保给变量指定合法的.期望的值. <2>枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示. <3>枚举使代码更

  • C#如何获取枚举的描述属性详解

    前言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时在使用枚举类型时,我们需要取名称和值,甚至有时候还需要取枚举类型的描述.通过反射,我们能获取到枚举类型的描述属性. 首先我们需要给枚举类型添加描述属性(属性都没有是不可能取到的),[Description]就是描述属性,使用这个属性,我们需要添加 using System.ComponentModel 引用. public enum EnumSex { /// <summary> /// 男 /// </summary>

  • 细说C#中的枚举:转换、标志和属性

    枚举是 C# 中最有意思的一部分,大部分开发人员只了解其中的一小部分,甚至网上绝大多数的教程也只讲解了枚举的一部分.那么,我将通过这篇文章向大家具体讲解一下枚举的知识.我将从大家都了解的部分开始讲解,然后再讲解大家所不知道的或者了解很少的部分. 零.基础知识 枚举是由开发人员声明的一种 值类型 ,它在编译时就声明了一种 具名常量值 .使用枚举可以使我们的代码简单易读,我们先来看一下两个代码段: // 代码段 1 void Method(int country) { switch (country

  • C#中枚举的特性 FlagAttribute详解

    写在前面 枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型.可以看出枚举的出现时为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟悉,本文主要介绍枚举的特性 FlagAttribute. FlagAttribute是什么? Flag 特性微软的解释是:指示可以将枚举作为位域(即一组标志)处理,FlagsAttribute属性就是枚举类型的一项可选属性,它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域).所谓位域是

  • C#如何利用反射将枚举绑定到下拉框详解

    前言: 反射(Reflection)是.NET提供给开发者的一个强大工具,尽管作为.NET框架的使用者,很多时候不会用到反射.但在一些情况下,尤其是在开发一些基础框架或公共类库时,使用反射会使系统架构更加灵活. 在开发中,我们常常会遇到比如有些状态值在定义好后几乎从不改动,这时候使用数据库就显得有些多余了.首先想到的一个办法可能是在程序中创建一个数组来表示,此时,我们遇到了使用数组可能带来的第一个问题:不方便使用.当数组结构变更时,可能意味着所有使用过此数组的地方的索引都发生了变更,这是我们不想

  • 快速学习c# 枚举

    一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 (1)枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. (2)枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类

  • 详细了解C# 枚举与位枚举

    一.枚举的概念: C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型): 二.枚举的定义: 声明enum变量: enum <enum_name> {enumeration list}; 其中enum_name 指定枚举的类型名称:  enumeration list 是一个用逗号分隔的标识符列表: 枚举列表中的每个符号代表一个整数值,一个比他前面的符号大的整数值.默认情况下,第一个枚举符号的值是0.例如: enum Days {Sun , Mon, tue, Fi

  • 超详细注释之OpenCV按位AND OR XOR和NOT

    这篇博客将介绍如何使用OpenCV应用按位AND.OR.XOR和NOT.上一篇学习了如何从图像中裁剪和提取感兴趣的区域(ROI),截取的都是矩形.但是如果想裁剪一个非矩形区域呢?该怎么办? 答案是同时应用位运算和掩蔽. AND:当且仅当两个像素都大于零时,按位AND为真. OR:如果两个像素中的任何一个大于零,则按位或为真. XOR:当且仅当两个像素中的一个大于零,而不是两个都大于零时,按位异或为真. NOT:按位NOT反转图像中的"开"和"关"像素. 比较好记的是

  • c++11 实现枚举值到枚举名的转换问题

    目录 效果 关键技术 __VA_ARGS__ #__VA_ARGS__ 在函数外执行代码的能力 模板函数的静态变量 关键代码 源码地址 效果 ENUM_DEFINE ( Color, Red, Blue, ) EnumHelper(Color::Red) -> "Red" EnumHelper(Color::Red, std::toupper) -> "RED" 关键技术 __VA_ARGS__ __VA_ARGS__ 实现了可变参数的宏. #defin

  • Java枚举与.net枚举区别详解

    通过一段时间的项目实践,发现java中的枚举与.net中的枚举有很大的差别,初期造成了我对java中的枚举一些错误理解及部分有缺陷的应用,其实追其原因还是因为我会习惯性的认为java的枚举在作用以及定义上与.net应该是差不多的,毕竟两者都是高级语言,语言上也有很多相似之处.这就是老师傅常说的新手好教,老兵不好教的原因,新手脑子一片空白不会有任何干扰,老兵总会以自己曾经的某些经验与新知识做对比. 习惯性观点一:枚举的定义应该与.net相同,比如在.net中我们可以这样定义枚举. public e

  • java中的枚举类型详细介绍

    枚举中有values方法用于按照枚举定义的顺序生成一个数组,可以用来历遍.我们自定义的枚举类都是继承自java.lang.Enum,拥有一下实例中的功能: 复制代码 代码如下: //: enumerated/EnumClass.java // Capabilities of the Enum class import static net.mindview.util.Print.*; enum Shrubbery { GROUND, CRAWLING, HANGING } public clas

  • 枚举的用法详细总结

    1.枚举enum的用途浅例写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等.更常见的,打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即:const int input = 1;const int output = 2;const int append = 3;然后,调用以下函数:bool open_file(string file_

  • C语言自定义类型超详细梳理之结构体 枚举 联合体

    目录 一.什么是结构体 1.结构体实现 2.匿名结构体类型 3.结构体自引用 4.结构体的内存对齐 5.结构体位段  二.什么是枚举 1.枚举类型的定义 2.枚举的优点 三.联合(共用体) 1.什么是联合(共用体) 2.联合(共用体)的定义 3.联合(共用体)的初始化 总结 一.什么是结构体 结构是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. //结构体声明 struct tag //struct:结构体关键字,tag:标签名,合起来是结构体类型(类型名) { memb

  • Java泛型枚举Annotation接口详细解读与Eclipse发展

    目录 1.Eclipse开发工具 1.1 Eclipse历史 1.2 快捷键 1.3 Debug调试 1.4 JUNIT测试工具 2.Java基础新特性 2.1 可变参数 2.2 foreach输出 2.3 静态导入 3. JDK三大主要特性--泛型 3.1 泛型的引出 3.2 泛型实现 3.3 通配符 3.4 泛型接口 3.5 泛型方法 4.JDK三大主要特性--枚举 4.1 多例与枚举 4.2 Enum类 面试题:请解释enum和Enum的区别? 4.3 枚举中定义其它结构 4.4 枚举应用

  • java中枚举的详细使用介绍

    枚举特点 1.用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类.其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口 2.枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰: 3.枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例.列出这些实例时,系统会自动添加public static fin

  • 枚举和宏的区别详细解析

    枚举常量与宏的区别主要有几点: 1.枚举常量是实体中的一种,但宏不是实体: 2.枚举常量属于常量,但宏不是常量: 3.枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域.值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符.枚举类型主要用于限制性输入,例如,某个函数的某参数只接受某种类型中的有限个数值,除此之外的其它数值都不接受,这时候枚举能很好地解决这个问题.能用枚举尽量用枚举,否则在调试的时候你是看不到当时的值的. 4.用宏去定义一个变量如果你定义了一个相同的变量

随机推荐