看到导师的代码中枚举从0.1.2.4开始赋值,不解于是百度了一下

c#中枚举值为什么使用1,2,4,8,16,32等2的幂方

使用1,2,4,8,16,32等2的幂方,防止重复。 
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天;还有就是用来表示多种复合的状态。这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: 
[Flags]  
enum Styles{  
ShowBorder = 1,         //是否显示边框 
ShowCaption = 2,        //是否显示标题 
ShowToolbox = 4         //是否显示工具箱 

  这样我们就可以用"或"运算符组合多个状态,例如
myControl.Style = Styles.ShowBorder | Styles.ShowCaption;  
  这时myControl.Style枚举的值将变成 1+2=3,它的ToString()将变成"Styles.ShowBorder , Styles.ShowCaption" 
  这里我们可以解释为什么第三个值ShowToolbox可以为4,5..而不能为3。也就是说它的值不应该是前几项值的复合值。有一个比较简单的方法就是用2的n次方来依次为每一项赋值,例如 1,2,4,8,16,32,64..... 
  现在举个常见的Flags应用例子。例如一个简单的权限系统,有"Admin"和"User"两种角色,我们可以在表中放一个varchar()字段,以文本形式存放权限字"Admin,User"。但是用Flags型枚举的话,我们就可以直接将 Roles.Admin | Roles.User 的值放在一个int字段里。 
  以下是关于枚举的一些常见操作: 
  将枚举的值变回枚举对象: 
  Styles style = (Styles) Enum.Parse(typeof(Styles), 4 );    // -> style = Styles.Toolbox; 
  检查枚举是否包含某个元素: 
  bool hasFlag = ((style & Styles.ShowBorder) != 0); 
  其实我们还会碰到一种情况,就是需要从组合状态中去掉一个元素。用"^"运算符可以做到:
  Styles style = Styles.ShowBorder | Styles.ShowCaption;  
  style = style ^ Styles.ShowBorder; 
  这个时候style的值就会变成 Styles.ShowCaption 
  但这里有一个很严重的问题(偶现在才发现) 
  我们这个时候再执行一次 
  style = style ^ Styles.ShowBorder; 
  按照我们的设想,这个时候 style 的值是 Styles.ShowCaption,不包含 Styles.ShowBorder,所以我们就算去掉这个元素,style应该还是不会变。但实际的 style 的值却又变成了 Styles.ShowBorder | Styles.ShowCaption !! 再执行一遍,又会去掉这个元素,周而复始。 
  当然我们可以在去掉某个元素前做一番检查,如果枚举包含这个元素,再去掉它:
if ((style & Styles.ShowBorder) != 0){  
    style = style ^ Styles.ShowBorder;  

  不知道有没有其它方法可以方便地从Flags枚举状态中去掉一个元素。。 
  Thanks to mobilebilly: 
  style = style & (~Styles.ShowBorder) 可以方便去掉一个元素。 
 (2)枚举成员
        枚举成员是该枚举类型的命名常数。每个枚举成员名称唯一且均具有相关联的常数值,此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
    示例:
        public enum TimeofDay:uint
        {
            Morning=-3,
            Afternoon=-2,
            Evening=-1
         }  
    产生编译时错误,原因是常数值 -1、-2 和 –3 不在基础整型 uint 的范围内。
    注意:为所有的每句成员加上注释是很必要的,否则别人看到你的成员里面那么多不认识的单词甚至缩写有多么痛苦……
(3)枚举成员赋值
        规则:允许多个枚举成员有相同的值,允许无顺序地定义成员值,没有显式赋值的成员的值默认为上一个成员的值+1(第一个成员如果没赋值的话默认就是0)。另外,枚举值都不能超过它的基础类型范围。
      示例
        public enum Color
        {
            red = 1,
            green,
            orange = 1,
            grey = 5,
            purple
        }
        上面green的值为2,而purple的值则为6。 red和orange同为1。
    注意:正是由于默认+1这样的规则,建议每个成员都手动赋值,以免出现程序写到一半,从前面改动或者增加成员的时候,后面的成员默认值都会改变,这就麻烦了。
(4)枚举类型与基础类型的转换
     基础类型不能隐式转换为枚举类型
     枚举类型也不能隐式转换为基础类型
    示例:
    public enum Number
    {
        a,
        b
    }
    class Test
    {
        public static void Main()
        {
            int i = Number.a;//错误,要强制类型转换(int)Number.a
            Number n;
            n = 2;//又错误,要强制类型转换(Number)2
        }
    }
(5)枚举类型的使用
switch(timeofDay) //switch中的使用
{
   case TimeofDay.Morning:
        Console.WriteLine("good morning");
        break;
        //……其他的省略啦
}
int hashCode = timeofDay.Morning.GetHashCode();//得到枚举成员的值
string str = timeofDay.Morning.toString();//得到枚举成员的名字
string enumParseStr = Enum.Parse(typeof(timeofDay) , hashCode.ToString()).toString();//将枚举的值转换成对应的名字
int enumParseInt = Convert.ToInt32(Enum.Parse(typeof(timeofTime), str));//将枚举的名字转换成对应的值

时间: 2024-10-09 09:42:05

看到导师的代码中枚举从0.1.2.4开始赋值,不解于是百度了一下的相关文章

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件

这篇的内容很简单,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个按钮分别命名了吧? 现在要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/918 文章来源:笨木头与游戏开发 根据名字查找控件 首先给TollgateScene再include一些头文件,不然等会编译又报错了: #include "editor-support/cocostudio/CCSGUIReader.h&quo

编写高质量的iOS代码--Effective Objective-C 2.0 读书笔记

编写高质量的iOS代码--Effective Objective-C 2.0 读书笔记 这本书年初刷完,感觉不错,介绍了很多小点,都是平日不怎么关注的. 第1章 熟悉Objective-C 这章没什么好介绍 第1条:了解Objective-C语言的起源 第2条:在类的头文件中尽量少引入其他头文件 第3条:多用字面量语法,少用与之等价的方法 第4条:多用类型常量,少用#define预处理指令 要理解为啥要少用#define预处理指令. 然后具体用哪个, 自己定吧 第5条:用枚举表示状态.选项.状态

Swift 中枚举

Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTURE]categories: [Swift 进阶]permalink: advanced-practical-enum-examples 原文链接=http://appventure.me/2015/10/17/advanced-practical-enum-examples/作者=Benedik

Java中枚举的写法和用法

在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法 关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代码. (1)代码片段一 package com.tomtop.application.libraries.constentEnum; /** * 包材领用状态枚举类 * @author zeng.xiao.yan * @date Jun 5, 2017 1:04:40 PM * @version V1.0 */ public en

关于Java中枚举Enum的深入剖析

在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java 5 引入的特性,用来方便Java开发者实现枚举应用.一个简单的Enum使用如下. // ColorEnum.javapublic enum ColorEmun { RED, GREEN, YELLOW} public void setColorEnum(ColorEmun colorEnum) {

漫谈反射在业务代码中的应用

很多人都觉得写业务代码很枯燥,没有什么技术含量,大部分就是if-else逻辑的叠加.写业务代码确实没有写中间件来的高大上,但是我觉得不管是写什么代码,想要写出好的代码都不是一件容易的事情.这不,最近我们生产系统的版本迭代过程中一个需求就让我思考了很多,并且在实现方式上做得更加的优雅. 场景如下:我们在生产系统中需要维护各个游戏的状态,当需要上线一个游戏时,需要对该游戏的各方面的信息做一遍检查,当检查所有的字段都达到要求之后,再切换该游戏的状态为已上线.首先,针对安卓游戏,我们需要检查该游戏的资质

JDK中枚举的底层实现

前提 上一篇文章复习介绍了JDK中注解的底层实现,跟注解一样比较常用,但是底层实现比较神秘的还有枚举类型.趁着国庆假期的最后两天,把JDK中枚举的底层实现也进行一次探究. 通过例子查找本质 在探究JDK注解的底层实现的时候,因为预先参考了不少资料,所以整个过程有点"未卜先知"的意味,这里尝试用未知的角度去看注解的底层实现.先定义一个手机操作系统类型枚举PhoneOsEnum: package club.throwable.enumeration; public enum PhoneOs

DELPHI中枚举类型数据的介绍和使用方法

在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类型数据的介绍和使用方法.见笑..------------------------------------------------------枚举类型 Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据.例如,性别.月份.星期几.颜色.单位名.学历.职业等.1.枚举类型的定义格式: ty