C# Enum Flags

enum

enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型。

通常情况下,最好是在命名空间內直接定义 enum,以便该命名空间中所有的类都能够同样方便地访问它。

当然,也可以把enum嵌套在类或结构体中。

默认情况下,第一个枚举数的值为 0后面每个枚举数的值依次递增 1。 例如,下面的枚举,Sat 是 0,Sun 是 1,Mon 是 2 等.

例如,下面的枚举,Sat 是 0,Sun 是 1,Mon 是 2 等.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

如下面的示例所示枚举数可用初始值来重写默认值。

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

在此枚举中,强制元素序列从 1 而不是 0 开始。 但是,一般建议包括值为 0 的常量。 有关更多信息,请参见 枚举类型(C# 编程指南)

每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。 枚举元素的默认基础类型为 int。 要声明另一整型枚举(如 byte),请在标识符之后紧跟类型,然后再使用冒号,如下面的示例所示。

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

enum 的标准类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。

可以给 Days 类型的变量赋以基础类型范围内的任何值,所赋的值不限于已命名的常数。

enum E 的默认值为表达式 (E)0 生成的值。

说明

枚举数的名称中不能包含空白。

枚举最常用在的地方,就是搭配 swith case 來完成 if else 的功能;

enum参考:https://msdn.microsoft.com/zh-cn/library/sbbt4032(v=vs.120).aspx

FlagsAttribute

enum搭配  Flags(System.FlagsAttribute)属性 ,指示可以将枚举作为 bit field(即一组标志)处理。这样就可以对其执行 AND与(&)、OR或(|)、NOT非(~) 和 XOR异或(^) 位元运算。

C#运算符 https://msdn.microsoft.com/zh-cn/library/6a71f45d.aspx

FlagsAttribute参考:https://msdn.microsoft.com/zh-cn/library/system.flagsattribute.aspx

 

Demo

1.定义enum为CWeaponType

[System.Flags]
public enum CWeaponType
{
    Unknow=0,
    Normal=1, // 出击武器
    Mat=2,    // 进化未知素材
    Cat=4,    // 进化素材猫
    Mouse=8,  // 进化素材鼠
    Plus=16,   // 加蛋
    Exp=32,    // 经验猪
    WakeUp=64, // 觉醒碎片
    Money=128,  // 金钱猫
    Crit=256,   // 暴击碎片
    Fragment=512,// 英灵碎片

    Weapon = Normal | Fragment //武器
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2.判断fragment是否为武器

private void Start()
{
    var type1 = CWeaponType.Fragment;
    var type2 = CWeaponType.Exp;
    var log1 = string.Format("{0} is weapon:{1}", type1, (int) (CWeaponType.Weapon & type1) != 0);
    var log2 = string.Format("\t {0} is weapon:{1}", type2, (int) (CWeaponType.Weapon & type2) != 0);
    Debug.LogWarning(log1 + log2);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3.运行结果

Fragment is weapon:True     Exp is weapon:False

此demo 就是判断 fragment 是否属于weapon?

代码中使用 & 符号判断,结果为 0 就不属于,结果为(int)CWeaponType.Fragment 就是属于。

 

附:把字符串转成枚举

CWeaponType type= (CWeaponType) Enum.Parse(typeof (CWeaponType), "Normal");

获取枚举的名字

string enumName=Enum.GetName(typeof (CWeaponType), 4);
//结果输出: Cat

参考资料

http://www.dotnetperls.com/enum-flags

http://www.dotblogs.com.tw/atowngit/archive/2009/11/19/12051.aspx?fid=70079

时间: 2024-10-12 09:36:11

C# Enum Flags的相关文章

enum flags 枚举Flags标示 位运算符

C#位运算 详见:http://wenku.baidu.com/link?url=4KUNkwuVTm8dwhmPLXeyYytmnDOJnmLG1L2C77kP-rY0On33ksQxwchoTlqhHd4j41cRk1_3UK7amfR_fWh0Hh1EroSy0y-CgExegjZJBbS -------------------------------- C#的Enum中Flags的用法(枚举赋多值和如何进行判断) 2012-04-23 10:26:06|  分类: 程序(NET)|举报|

Entity Framework and Enum Flags - Falafel Software Blog

If you have ever had the need to store one or more possible values in a single field, you may have used the [Flags] attribute on an enum in C# which would look something like this: C# [Flags] public enum ColorFlags { Red = 1, Orange = 2, Yellow = 4,

Android NuPlayer要点详解

本文将基于Android N源码对NuPlayer做一个详解.NuPlayer是Android中本地和流媒体播放所用的播放器. 1.AHandler机制 首先介绍NuPlayer中无处不在的AHandler机制 frameworks/av/include/media/stagefright/foundation/ frameworks/av/media/libstagefright/foundation/ AHandler是Android native层实现的一个异步消息机制,在这个机制中所有的

Android -- Audio Native服务之启动流程分析(一)

Android -- Audio Native服务之启动流程分析(一) Android中的Audio系统是比较庞大.繁杂的一部分内容, 其中会涉及较多的音频编解码.多媒体制式与Android Audio HAL设备管理的知识.随着Android的发展,其所支持的音频设备也变得越来丰富,如扬声器.耳机.听筒等等:这种变化也为Android管理如此丰富的音频设备以及如何正确.合理地切换音频输出提出了更高的要求.面对如此繁杂的管理要求,我们分析Android Audio服务的历程想必也不会轻松.接下来

juce Justification 分析

很简单的一个类,一个rect放置在另一个rect中如何放置.只是没有考虑边距等,估且认为是在外层作考虑吧.然后认为是外框比内框大,所以外层怕是要进行检查才行 #ifndef JUCE_JUSTIFICATION_H_INCLUDED #define JUCE_JUSTIFICATION_H_INCLUDED //============================================================================== /** Represents

C++11 FAQ

 C++11 FAQ auto – 从初始化中推断数据类型 当数据类型未知或不便书写时,使用auto可让编译器自动根据用以初始化变量的表达式类型来推导变量类型.考虑如下代码: template<class T > void printall(const vector< T>& v) { // 根据v.begin()的返回值类型自动推断p的数据类型 for ( auto p = v.begin(); p != v.end(); ++p) cout << *p

c++ 11 游记 之 decltype constexpr

title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:1307316一九六八(仅接受短信) 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips for image: http://7xjs3n.com1.z0.glb.clouddn.com c+

C#:USB设备枚举 --转自CSDN作者:Splash

(一)DeviceIoControl的PInvoke /* ---------------------------------------------------------- 文件名称:DeviceIoControl.cs 作者:秦建辉 MSN:[email protected] QQ:36748897 博客:http://blog.csdn.net/jhqin 开发环境: Visual Studio V2010 .NET Framework 4 Client Profile 版本历史: V1

HotSpot模板解释器目标代码生成过程源码分析

虽然说解释执行模式是逐字逐句翻译给目标平台运行的,但这样的过程未免太过缓慢,如果能把字节码说的话做成纸条,运行时只要把对应的纸条交给目标平台就可以了,这样,执行速度就会明显提升.JVM的Hotspot虚拟机的模板解释器就是用这种方法来解释执行的.在开始分析之前,先了解一下JVM的执行方式. (1).边解释边运行,即每次解释一条字节码并运行其解释的本地代码,这种执行引擎速度相对很慢  (2).JIT(即时编译)具有更快的运行速度但是需要更多的内存,方法被第一次调用时,字节码编译生成的本地代码将会被